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

package org.bouncycastle.pqc.crypto.lms;

import org.bouncycastle.crypto.Digest;

class LMS
{
    static final short D_LEAF = -32126;
    static final short D_INTR = -31869;
    
    public static LMSPrivateKeyParameters generateKeys(final LMSigParameters lmSigParameters, final LMOtsParameters lmOtsParameters, final int n, final byte[] array, final byte[] array2) throws IllegalArgumentException {
        if (array2 == null || array2.length < lmSigParameters.getM()) {
            throw new IllegalArgumentException("root seed is less than " + lmSigParameters.getM());
        }
        return new LMSPrivateKeyParameters(lmSigParameters, lmOtsParameters, n, array, 1 << lmSigParameters.getH(), array2);
    }
    
    public static LMSSignature generateSign(final LMSPrivateKeyParameters lmsPrivateKeyParameters, final byte[] array) {
        final LMSContext generateLMSContext = lmsPrivateKeyParameters.generateLMSContext();
        generateLMSContext.update(array, 0, array.length);
        return generateSign(generateLMSContext);
    }
    
    public static LMSSignature generateSign(final LMSContext lmsContext) {
        return new LMSSignature(lmsContext.getPrivateKey().getQ(), LM_OTS.lm_ots_generate_signature(lmsContext.getPrivateKey(), lmsContext.getQ(), lmsContext.getC()), lmsContext.getSigParams(), lmsContext.getPath());
    }
    
    public static boolean verifySignature(final LMSPublicKeyParameters lmsPublicKeyParameters, final LMSSignature lmsSignature, final byte[] array) {
        final LMSContext generateOtsContext = lmsPublicKeyParameters.generateOtsContext(lmsSignature);
        LmsUtils.byteArray(array, generateOtsContext);
        return verifySignature(lmsPublicKeyParameters, generateOtsContext);
    }
    
    public static boolean verifySignature(final LMSPublicKeyParameters lmsPublicKeyParameters, final byte[] array, final byte[] array2) {
        final LMSContext generateLMSContext = lmsPublicKeyParameters.generateLMSContext(array);
        LmsUtils.byteArray(array2, generateLMSContext);
        return verifySignature(lmsPublicKeyParameters, generateLMSContext);
    }
    
    public static boolean verifySignature(final LMSPublicKeyParameters lmsPublicKeyParameters, final LMSContext lmsContext) {
        final LMSSignature lmsSignature = (LMSSignature)lmsContext.getSignature();
        final LMSigParameters parameter = lmsSignature.getParameter();
        final int h = parameter.getH();
        final byte[][] y = lmsSignature.getY();
        final byte[] lm_ots_validate_signature_calculate = LM_OTS.lm_ots_validate_signature_calculate(lmsContext);
        int i = (1 << h) + lmsSignature.getQ();
        final byte[] j = lmsPublicKeyParameters.getI();
        final Digest digest = DigestUtil.getDigest(parameter);
        final byte[] array = new byte[digest.getDigestSize()];
        digest.update(j, 0, j.length);
        LmsUtils.u32str(i, digest);
        LmsUtils.u16str((short)(-32126), digest);
        digest.update(lm_ots_validate_signature_calculate, 0, lm_ots_validate_signature_calculate.length);
        digest.doFinal(array, 0);
        int n = 0;
        while (i > 1) {
            if ((i & 0x1) == 0x1) {
                digest.update(j, 0, j.length);
                LmsUtils.u32str(i / 2, digest);
                LmsUtils.u16str((short)(-31869), digest);
                digest.update(y[n], 0, y[n].length);
                digest.update(array, 0, array.length);
                digest.doFinal(array, 0);
            }
            else {
                digest.update(j, 0, j.length);
                LmsUtils.u32str(i / 2, digest);
                LmsUtils.u16str((short)(-31869), digest);
                digest.update(array, 0, array.length);
                digest.update(y[n], 0, y[n].length);
                digest.doFinal(array, 0);
            }
            i /= 2;
            if (++n == y.length && i > 1) {
                return false;
            }
        }
        return lmsPublicKeyParameters.matchesT1(array);
    }
}
