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

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

import javax.crypto.spec.SecretKeySpec;
import java.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.hqc.HQCKEMExtractor;
import org.bouncycastle.jcajce.spec.KTSParameterSpec;
import javax.crypto.KEMSpi;

public class HQCDecapsulatorSpi implements KEMSpi.DecapsulatorSpi
{
    BCHQCPrivateKey privateKey;
    KTSParameterSpec parameterSpec;
    HQCKEMExtractor kemExt;
    
    public HQCDecapsulatorSpi(final BCHQCPrivateKey privateKey, final KTSParameterSpec parameterSpec) {
        this.privateKey = privateKey;
        this.parameterSpec = parameterSpec;
        this.kemExt = new HQCKEMExtractor(privateKey.getKeyParams());
    }
    
    @Override
    public SecretKey engineDecapsulate(final byte[] obj, final int n, final int n2, String keyAlgorithmName) throws DecapsulateException {
        Objects.checkFromToIndex(n, n2, 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);
        }
        final boolean b = this.parameterSpec.getKdfAlgorithm() != null;
        return new SecretKeySpec(Arrays.copyOfRange(KdfUtil.makeKeyBytes(this.parameterSpec, this.kemExt.extractSecret(obj)), n, n2), keyAlgorithmName);
    }
    
    @Override
    public int engineSecretSize() {
        return this.parameterSpec.getKeySize() / 8;
    }
    
    @Override
    public int engineEncapsulationSize() {
        return this.kemExt.getEncapsulationLength();
    }
}
