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

package org.bouncycastle.pqc.crypto.falcon;

import org.bouncycastle.crypto.CryptoServicesRegistrar;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.pqc.crypto.MessageSigner;

public class FalconSigner implements MessageSigner
{
    private byte[] encodedkey;
    private FalconNIST nist;
    
    @Override
    public void init(final boolean b, final CipherParameters cipherParameters) {
        if (b) {
            if (cipherParameters instanceof ParametersWithRandom) {
                final FalconPrivateKeyParameters falconPrivateKeyParameters = (FalconPrivateKeyParameters)((ParametersWithRandom)cipherParameters).getParameters();
                this.encodedkey = falconPrivateKeyParameters.getEncoded();
                this.nist = new FalconNIST(falconPrivateKeyParameters.getParameters().getLogN(), falconPrivateKeyParameters.getParameters().getNonceLength(), ((ParametersWithRandom)cipherParameters).getRandom());
            }
            else {
                final FalconPrivateKeyParameters falconPrivateKeyParameters2 = (FalconPrivateKeyParameters)cipherParameters;
                this.encodedkey = ((FalconPrivateKeyParameters)cipherParameters).getEncoded();
                this.nist = new FalconNIST(falconPrivateKeyParameters2.getParameters().getLogN(), falconPrivateKeyParameters2.getParameters().getNonceLength(), CryptoServicesRegistrar.getSecureRandom());
            }
        }
        else {
            final FalconPublicKeyParameters falconPublicKeyParameters = (FalconPublicKeyParameters)cipherParameters;
            this.encodedkey = falconPublicKeyParameters.getH();
            this.nist = new FalconNIST(falconPublicKeyParameters.getParameters().getLogN(), falconPublicKeyParameters.getParameters().getNonceLength(), CryptoServicesRegistrar.getSecureRandom());
        }
    }
    
    @Override
    public byte[] generateSignature(final byte[] array) {
        return this.nist.crypto_sign(new byte[this.nist.CRYPTO_BYTES], array, array.length, this.encodedkey);
    }
    
    @Override
    public boolean verifySignature(final byte[] array, final byte[] array2) {
        if (array2[0] != (byte)(48 + this.nist.LOGN)) {
            return false;
        }
        final byte[] array3 = new byte[this.nist.NONCELEN];
        final byte[] array4 = new byte[array2.length - this.nist.NONCELEN - 1];
        System.arraycopy(array2, 1, array3, 0, this.nist.NONCELEN);
        System.arraycopy(array2, this.nist.NONCELEN + 1, array4, 0, array2.length - this.nist.NONCELEN - 1);
        return this.nist.crypto_sign_open(array4, array3, array, this.encodedkey) == 0;
    }
}
