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

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

There is a newer version: 1.12.0
Show newest version
package org.bouncycastle.tsp.ers;

import java.util.ArrayList;
import java.util.List;

import org.bouncycastle.asn1.tsp.PartialHashtree;
import org.bouncycastle.operator.DigestCalculator;

/**
 * Calculator based on the use of a left weighted binary Merkle tree created
 * on top of the partial hash tree objects provided.
 */
public class BinaryTreeRootCalculator
    implements ERSRootNodeCalculator
{
    public byte[] computeRootHash(DigestCalculator digCalc, PartialHashtree[] nodes)
    {
        List hashes = new ArrayList();
        for (int i = 0; i <= nodes.length - 2; i += 2)
        {
            byte[] left = ERSUtil.computeNodeHash(digCalc, nodes[i]);
            byte[] right = ERSUtil.computeNodeHash(digCalc, nodes[i + 1]);

            hashes.add(ERSUtil.calculateBranchHash(digCalc, left, right));
        }

        if (nodes.length % 2 == 1)
        {
            hashes.add(ERSUtil.computeNodeHash(digCalc, nodes[nodes.length - 1]));
        }

        do
        {
            List newHashes = new ArrayList((hashes.size() + 1) / 2);

            for (int i = 0; i <= hashes.size() - 2; i += 2)
            {
                newHashes.add(ERSUtil.calculateBranchHash(digCalc, (byte[])hashes.get(i), (byte[])hashes.get(i + 1)));
            }

            if (hashes.size() % 2 == 1)
            {
                newHashes.add(hashes.get(hashes.size() - 1));
            }

            hashes = newHashes;
        }
        while (hashes.size() > 1);

        return (byte[])hashes.get(0);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy