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

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

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

public class HQCEncapsulatorSpi implements KEMSpi.EncapsulatorSpi
{
    private final BCHQCPublicKey publicKey;
    private final KTSParameterSpec parameterSpec;
    private final HQCKEMGenerator kemGen;
    
    public HQCEncapsulatorSpi(final BCHQCPublicKey publicKey, final KTSParameterSpec parameterSpec, final SecureRandom secureRandom) {
        this.publicKey = publicKey;
        this.parameterSpec = parameterSpec;
        this.kemGen = new HQCKEMGenerator(secureRandom);
    }
    
    @Override
    public KEM.Encapsulated engineEncapsulate(final int n, final int n2, String keyAlgorithmName) {
        Objects.checkFromToIndex(n, n2, 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 boolean b = this.parameterSpec.getKdfAlgorithm() != null;
        final SecretWithEncapsulation generateEncapsulated = this.kemGen.generateEncapsulated(this.publicKey.getKeyParams());
        return new KEM.Encapsulated(new SecretKeySpec(Arrays.copyOfRange(KdfUtil.makeKeyBytes(this.parameterSpec, generateEncapsulated.getSecret()), n, n2), keyAlgorithmName), generateEncapsulated.getEncapsulation(), null);
    }
    
    @Override
    public int engineSecretSize() {
        return this.parameterSpec.getKeySize() / 8;
    }
    
    @Override
    public int engineEncapsulationSize() {
        final String name = this.publicKey.getKeyParams().getParameters().getName();
        switch (name) {
            case "HQC-128": {
                return 128;
            }
            case "HQC-192": {
                return 192;
            }
            case "HQC-256": {
                return 256;
            }
            default: {
                return -1;
            }
        }
    }
}
