All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bouncycastle.tsp.ers.ERSCachingData Maven / Gradle / Ivy

package org.bouncycastle.tsp.ers;

import java.util.HashMap;
import java.util.Map;

import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.operator.DigestCalculator;
import org.bouncycastle.util.Arrays;

/**
 * An ERSData object that caches hash calculations.
 */
public abstract class ERSCachingData
    implements ERSData
{
    private Map  preCalcs = new HashMap ();

    /**
     * Generates a hash for the whole DataGroup.
     *
     * @param digestCalculator the {@link DigestCalculator} to use for computing the hash
     * @return a hash that is representative of the whole DataGroup
     */
    public byte[] getHash(DigestCalculator digestCalculator, byte[] previousChainHash)
    {
        CacheIndex digAlgID = new CacheIndex(digestCalculator.getAlgorithmIdentifier(), previousChainHash);
        if (preCalcs.containsKey(digAlgID))
        {
            return (byte[])preCalcs.get(digAlgID);
        }

        byte[] hash = calculateHash(digestCalculator, previousChainHash);

        preCalcs.put(digAlgID, hash);

        return hash;
    }

    protected abstract byte[] calculateHash(DigestCalculator digestCalculator, byte[] previousChainHash);

    private static class CacheIndex
    {
        final AlgorithmIdentifier algId;
        final byte[] chainHash;

        private CacheIndex(AlgorithmIdentifier algId, byte[] chainHash)
        {
            this.algId = algId;
            this.chainHash = chainHash;
        }

        public boolean equals(Object o)
        {
            if (this == o)
            {
                return true;
            }
            if (!(o instanceof CacheIndex))
            {
                return false;
            }
            CacheIndex that = (CacheIndex)o;
            return algId.equals(that.algId) && Arrays.areEqual(chainHash, that.chainHash);
        }

        public int hashCode()
        {
            int result = algId.hashCode();
            return 31 * result + Arrays.hashCode(chainHash);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy