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

package org.bouncycastle.pqc.crypto.ntru;

import org.bouncycastle.pqc.math.ntru.Polynomial;
import org.bouncycastle.pqc.math.ntru.parameters.NTRUParameterSet;
import org.bouncycastle.pqc.crypto.util.SecretWithEncapsulationImpl;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.crypto.SecretWithEncapsulation;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import java.security.SecureRandom;
import org.bouncycastle.crypto.EncapsulatedSecretGenerator;

public class NTRUKEMGenerator implements EncapsulatedSecretGenerator
{
    private final SecureRandom random;
    
    public NTRUKEMGenerator(final SecureRandom random) {
        if (random == null) {
            throw new NullPointerException("'random' cannot be null");
        }
        this.random = random;
    }
    
    @Override
    public SecretWithEncapsulation generateEncapsulated(final AsymmetricKeyParameter asymmetricKeyParameter) {
        if (asymmetricKeyParameter == null) {
            throw new NullPointerException("'recipientKey' cannot be null");
        }
        final NTRUPublicKeyParameters ntruPublicKeyParameters = (NTRUPublicKeyParameters)asymmetricKeyParameter;
        final NTRUParameterSet parameterSet = ntruPublicKeyParameters.getParameters().getParameterSet();
        final NTRUSampling ntruSampling = new NTRUSampling(parameterSet);
        final NTRUOWCPA ntruowcpa = new NTRUOWCPA(parameterSet);
        final byte[] array = new byte[parameterSet.owcpaMsgBytes()];
        final byte[] bytes = new byte[parameterSet.sampleRmBytes()];
        this.random.nextBytes(bytes);
        final PolynomialPair sampleRm = ntruSampling.sampleRm(bytes);
        final Polynomial r = sampleRm.r();
        final Polynomial m = sampleRm.m();
        r.s3ToBytes(array, 0);
        m.s3ToBytes(array, parameterSet.packTrinaryBytes());
        final SHA3Digest sha3Digest = new SHA3Digest(256);
        final byte[] array2 = new byte[sha3Digest.getDigestSize()];
        sha3Digest.update(array, 0, array.length);
        sha3Digest.doFinal(array2, 0);
        r.z3ToZq();
        final byte[] encrypt = ntruowcpa.encrypt(r, m, ntruPublicKeyParameters.publicKey);
        final byte[] copyOfRange = Arrays.copyOfRange(array2, 0, parameterSet.sharedKeyBytes());
        Arrays.clear(array2);
        return new SecretWithEncapsulationImpl(copyOfRange, encrypt);
    }
}
