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

package org.bouncycastle.pqc.crypto.lms;

import org.bouncycastle.crypto.digests.SHAKEDigest;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.crypto.Digest;

class DigestUtil
{
    static Digest getDigest(final LMOtsParameters lmOtsParameters) {
        return createDigest(lmOtsParameters.getDigestOID(), lmOtsParameters.getN());
    }
    
    static Digest getDigest(final LMSigParameters lmSigParameters) {
        return createDigest(lmSigParameters.getDigestOID(), lmSigParameters.getM());
    }
    
    private static Digest createDigest(final ASN1ObjectIdentifier asn1ObjectIdentifier, final int n) {
        final Digest digest = createDigest(asn1ObjectIdentifier);
        if (NISTObjectIdentifiers.id_shake256_len.equals(asn1ObjectIdentifier) || digest.getDigestSize() != n) {
            return new WrapperDigest(digest, n);
        }
        return digest;
    }
    
    private static Digest createDigest(final ASN1ObjectIdentifier obj) {
        if (obj.equals(NISTObjectIdentifiers.id_sha256)) {
            return new SHA256Digest();
        }
        if (obj.equals(NISTObjectIdentifiers.id_shake256_len)) {
            return new SHAKEDigest(256);
        }
        throw new IllegalArgumentException("unrecognized digest OID: " + obj);
    }
    
    static class WrapperDigest implements Digest
    {
        private final Digest digest;
        private final int length;
        
        WrapperDigest(final Digest digest, final int length) {
            this.digest = digest;
            this.length = length;
        }
        
        @Override
        public String getAlgorithmName() {
            return this.digest.getAlgorithmName() + "/" + this.length * 8;
        }
        
        @Override
        public int getDigestSize() {
            return this.length;
        }
        
        @Override
        public void update(final byte b) {
            this.digest.update(b);
        }
        
        @Override
        public void update(final byte[] array, final int n, final int n2) {
            this.digest.update(array, n, n2);
        }
        
        @Override
        public int doFinal(final byte[] array, final int n) {
            final byte[] array2 = new byte[this.digest.getDigestSize()];
            this.digest.doFinal(array2, 0);
            System.arraycopy(array2, 0, array, n, this.length);
            return this.length;
        }
        
        @Override
        public void reset() {
            this.digest.reset();
        }
    }
}
