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

package org.bouncycastle.crypto.digests;

import org.bouncycastle.crypto.CryptoServicesRegistrar;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.params.SkeinParameters;
import org.bouncycastle.crypto.CryptoServicePurpose;
import org.bouncycastle.util.Memoable;
import org.bouncycastle.crypto.ExtendedDigest;

public class SkeinDigest implements ExtendedDigest, Memoable
{
    public static final int SKEIN_256 = 256;
    public static final int SKEIN_512 = 512;
    public static final int SKEIN_1024 = 1024;
    private final CryptoServicePurpose purpose;
    private SkeinEngine engine;
    
    public SkeinDigest(final int n, final int n2) {
        this(n, n2, CryptoServicePurpose.ANY);
    }
    
    public SkeinDigest(final int n, final int n2, final CryptoServicePurpose purpose) {
        this.engine = new SkeinEngine(n, n2);
        this.purpose = purpose;
        this.init(null);
        CryptoServicesRegistrar.checkConstraints(Utils.getDefaultProperties(this, this.getDigestSize() * 4, purpose));
    }
    
    public SkeinDigest(final SkeinDigest skeinDigest) {
        this.engine = new SkeinEngine(skeinDigest.engine);
        this.purpose = skeinDigest.purpose;
        CryptoServicesRegistrar.checkConstraints(Utils.getDefaultProperties(this, skeinDigest.getDigestSize() * 4, this.purpose));
    }
    
    @Override
    public void reset(final Memoable memoable) {
        this.engine.reset(((SkeinDigest)memoable).engine);
    }
    
    @Override
    public Memoable copy() {
        return new SkeinDigest(this);
    }
    
    @Override
    public String getAlgorithmName() {
        return "Skein-" + this.engine.getBlockSize() * 8 + "-" + this.engine.getOutputSize() * 8;
    }
    
    @Override
    public int getDigestSize() {
        return this.engine.getOutputSize();
    }
    
    @Override
    public int getByteLength() {
        return this.engine.getBlockSize();
    }
    
    public void init(final SkeinParameters skeinParameters) {
        this.engine.init(skeinParameters);
    }
    
    @Override
    public void reset() {
        this.engine.reset();
    }
    
    @Override
    public void update(final byte b) {
        this.engine.update(b);
    }
    
    @Override
    public void update(final byte[] array, final int n, final int n2) {
        this.engine.update(array, n, n2);
    }
    
    @Override
    public int doFinal(final byte[] array, final int n) {
        return this.engine.doFinal(array, n);
    }
}
