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

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

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 javax.crypto.DecapsulateException;
import java.util.Objects;
import javax.crypto.SecretKey;
import org.bouncycastle.pqc.crypto.ntruprime.SNTRUPrimeKEMExtractor;
import org.bouncycastle.jcajce.spec.KTSParameterSpec;
import javax.crypto.KEMSpi;

class SNTRUPrimeDecapsulatorSpi implements KEMSpi.DecapsulatorSpi
{
    BCSNTRUPrimePrivateKey privateKey;
    KTSParameterSpec parameterSpec;
    SNTRUPrimeKEMExtractor kemExt;
    
    public SNTRUPrimeDecapsulatorSpi(final BCSNTRUPrimePrivateKey privateKey, final KTSParameterSpec parameterSpec) {
        this.privateKey = privateKey;
        this.parameterSpec = parameterSpec;
        this.kemExt = new SNTRUPrimeKEMExtractor(privateKey.getKeyParams());
    }
    
    @Override
    public SecretKey engineDecapsulate(final byte[] obj, final int fromIndex, final int toIndex, String keyAlgorithmName) throws DecapsulateException {
        Objects.checkFromToIndex(fromIndex, toIndex, this.engineSecretSize());
        Objects.requireNonNull(keyAlgorithmName, "null algorithm");
        Objects.requireNonNull(obj, "null encapsulation");
        if (obj.length != this.engineEncapsulationSize()) {
            throw new DecapsulateException("incorrect encapsulation size");
        }
        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);
        }
        return new SecretKeySpec(Arrays.copyOfRange(KdfUtil.makeKeyBytes(this.parameterSpec, this.kemExt.extractSecret(obj)), fromIndex, toIndex), keyAlgorithmName);
    }
    
    @Override
    public int engineSecretSize() {
        return this.parameterSpec.getKeySize() / 8;
    }
    
    @Override
    public int engineEncapsulationSize() {
        return this.kemExt.getEncapsulationLength();
    }
}
