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

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

import org.bouncycastle.crypto.SecretWithEncapsulation;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.jcajce.spec.KEMKDFSpec;
import org.bouncycastle.pqc.jcajce.provider.util.KdfUtil;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import java.util.Objects;
import javax.crypto.KEM;
import java.security.SecureRandom;
import org.bouncycastle.pqc.crypto.ntruprime.SNTRUPrimeKEMGenerator;
import org.bouncycastle.jcajce.spec.KTSParameterSpec;
import javax.crypto.KEMSpi;

class SNTRUPrimeEncapsulatorSpi implements KEMSpi.EncapsulatorSpi
{
    private final BCSNTRUPrimePublicKey publicKey;
    private final KTSParameterSpec parameterSpec;
    private final SNTRUPrimeKEMGenerator kemGen;
    
    public SNTRUPrimeEncapsulatorSpi(final BCSNTRUPrimePublicKey publicKey, final KTSParameterSpec parameterSpec, final SecureRandom secureRandom) {
        this.publicKey = publicKey;
        this.parameterSpec = parameterSpec;
        this.kemGen = new SNTRUPrimeKEMGenerator(secureRandom);
    }
    
    @Override
    public KEM.Encapsulated engineEncapsulate(final int fromIndex, final int toIndex, String keyAlgorithmName) {
        Objects.checkFromToIndex(fromIndex, toIndex, this.engineSecretSize());
        Objects.requireNonNull(keyAlgorithmName, "null algorithm");
        if (!this.parameterSpec.getKeyAlgorithmName().equals("Generic") && keyAlgorithmName.equals("Generic")) {
            keyAlgorithmName = this.parameterSpec.getKeyAlgorithmName();
        }
        if (!this.parameterSpec.getKeyAlgorithmName().equals("Generic") && !this.parameterSpec.getKeyAlgorithmName().equals(keyAlgorithmName)) {
            throw new UnsupportedOperationException(this.parameterSpec.getKeyAlgorithmName() + " does not match " + keyAlgorithmName);
        }
        final SecretWithEncapsulation generateEncapsulated = this.kemGen.generateEncapsulated(this.publicKey.getKeyParams());
        return new KEM.Encapsulated(new SecretKeySpec(Arrays.copyOfRange(KdfUtil.makeKeyBytes(this.parameterSpec, generateEncapsulated.getSecret()), fromIndex, toIndex), keyAlgorithmName), generateEncapsulated.getEncapsulation(), null);
    }
    
    @Override
    public int engineSecretSize() {
        return this.parameterSpec.getKeySize() / 8;
    }
    
    @Override
    public int engineEncapsulationSize() {
        return this.publicKey.getKeyParams().getParameters().getRoundedPolynomialBytes() + 32;
    }
}
