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

package org.bouncycastle.pqc.crypto.xwing;

import org.bouncycastle.crypto.params.X25519PrivateKeyParameters;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.params.X25519PublicKeyParameters;
import org.bouncycastle.crypto.params.X25519KeyGenerationParameters;
import org.bouncycastle.crypto.generators.X25519KeyPairGenerator;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMPublicKeyParameters;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMKeyGenerationParameters;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMParameters;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMKeyPairGenerator;
import org.bouncycastle.crypto.prng.FixedSecureRandom;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.crypto.digests.SHAKEDigest;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.KeyGenerationParameters;
import java.security.SecureRandom;
import org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator;

public class XWingKeyPairGenerator implements AsymmetricCipherKeyPairGenerator
{
    private SecureRandom random;
    
    private void initialize(final KeyGenerationParameters keyGenerationParameters) {
        this.random = keyGenerationParameters.getRandom();
    }
    
    static AsymmetricCipherKeyPair genKeyPair(final byte[] array) {
        final SHAKEDigest shakeDigest = new SHAKEDigest(256);
        shakeDigest.update(array, 0, array.length);
        final byte[] array2 = new byte[96];
        shakeDigest.doOutput(array2, 0, array2.length);
        final byte[] copyOfRange = Arrays.copyOfRange(array2, 0, 64);
        final byte[] copyOfRange2 = Arrays.copyOfRange(array2, 64, 96);
        final FixedSecureRandom fixedSecureRandom = new FixedSecureRandom(copyOfRange);
        final MLKEMKeyPairGenerator mlkemKeyPairGenerator = new MLKEMKeyPairGenerator();
        mlkemKeyPairGenerator.init(new MLKEMKeyGenerationParameters(fixedSecureRandom, MLKEMParameters.ml_kem_768));
        final AsymmetricCipherKeyPair generateKeyPair = mlkemKeyPairGenerator.generateKeyPair();
        final MLKEMPublicKeyParameters mlkemPublicKeyParameters = (MLKEMPublicKeyParameters)generateKeyPair.getPublic();
        final MLKEMPrivateKeyParameters mlkemPrivateKeyParameters = (MLKEMPrivateKeyParameters)generateKeyPair.getPrivate();
        final FixedSecureRandom fixedSecureRandom2 = new FixedSecureRandom(copyOfRange2);
        final X25519KeyPairGenerator x25519KeyPairGenerator = new X25519KeyPairGenerator();
        x25519KeyPairGenerator.init(new X25519KeyGenerationParameters(fixedSecureRandom2));
        final AsymmetricCipherKeyPair generateKeyPair2 = x25519KeyPairGenerator.generateKeyPair();
        final X25519PublicKeyParameters x25519PublicKeyParameters = (X25519PublicKeyParameters)generateKeyPair2.getPublic();
        return new AsymmetricCipherKeyPair(new XWingPublicKeyParameters(mlkemPublicKeyParameters, x25519PublicKeyParameters), new XWingPrivateKeyParameters(array, mlkemPrivateKeyParameters, (X25519PrivateKeyParameters)generateKeyPair2.getPrivate(), mlkemPublicKeyParameters, x25519PublicKeyParameters));
    }
    
    @Override
    public void init(final KeyGenerationParameters keyGenerationParameters) {
        this.initialize(keyGenerationParameters);
    }
    
    @Override
    public AsymmetricCipherKeyPair generateKeyPair() {
        final byte[] bytes = new byte[32];
        this.random.nextBytes(bytes);
        return genKeyPair(bytes);
    }
}
