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

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

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

class DigestUtil
{
    static Digest getDigest(final ASN1ObjectIdentifier obj) {
        if (obj.equals(NISTObjectIdentifiers.id_sha256)) {
            return new SHA256Digest();
        }
        if (obj.equals(NISTObjectIdentifiers.id_sha512)) {
            return new SHA512Digest();
        }
        if (obj.equals(NISTObjectIdentifiers.id_shake128)) {
            return new SHAKEDigest(128);
        }
        if (obj.equals(NISTObjectIdentifiers.id_shake256)) {
            return new SHAKEDigest(256);
        }
        throw new IllegalArgumentException("unrecognized digest OID: " + obj);
    }
    
    static ASN1ObjectIdentifier getDigestOID(final String str) {
        if (str.equals("SHA-256")) {
            return NISTObjectIdentifiers.id_sha256;
        }
        if (str.equals("SHA-512")) {
            return NISTObjectIdentifiers.id_sha512;
        }
        if (str.equals("SHAKE128")) {
            return NISTObjectIdentifiers.id_shake128;
        }
        if (str.equals("SHAKE256")) {
            return NISTObjectIdentifiers.id_shake256;
        }
        throw new IllegalArgumentException("unrecognized digest: " + str);
    }
    
    public static byte[] getDigestResult(final Digest digest) {
        final byte[] array = new byte[digest.getDigestSize()];
        digest.doFinal(array, 0);
        return array;
    }
    
    public static String getXMSSDigestName(final ASN1ObjectIdentifier obj) {
        if (obj.equals(NISTObjectIdentifiers.id_sha256)) {
            return "SHA256";
        }
        if (obj.equals(NISTObjectIdentifiers.id_sha512)) {
            return "SHA512";
        }
        if (obj.equals(NISTObjectIdentifiers.id_shake128)) {
            return "SHAKE128";
        }
        if (obj.equals(NISTObjectIdentifiers.id_shake256)) {
            return "SHAKE256";
        }
        throw new IllegalArgumentException("unrecognized digest OID: " + obj);
    }
    
    static class DoubleDigest implements Digest
    {
        private SHAKEDigest digest;
        
        DoubleDigest(final SHAKEDigest digest) {
            this.digest = digest;
        }
        
        @Override
        public String getAlgorithmName() {
            return this.digest.getAlgorithmName() + "/" + this.digest.getDigestSize() * 2 * 8;
        }
        
        @Override
        public int getDigestSize() {
            return this.digest.getDigestSize() * 2;
        }
        
        @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) {
            return this.digest.doFinal(array, n, this.getDigestSize());
        }
        
        @Override
        public void reset() {
            this.digest.reset();
        }
    }
}
