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

org.testifyproject.bouncycastle.crypto.commitments.GeneralHashCommitter Maven / Gradle / Ivy

The newest version!
package org.testifyproject.bouncycastle.crypto.org.testifyproject.testifyprojectmitments;

import java.security.SecureRandom;

import org.testifyproject.bouncycastle.crypto.Commitment;
import org.testifyproject.bouncycastle.crypto.Committer;
import org.testifyproject.bouncycastle.crypto.DataLengthException;
import org.testifyproject.bouncycastle.crypto.Digest;
import org.testifyproject.bouncycastle.crypto.ExtendedDigest;
import org.testifyproject.bouncycastle.util.Arrays;

/**
 * A basic hash-org.testifyproject.testifyprojectmitter based on the one described in "Making Mix Nets Robust for Electronic Voting by Randomized Partial Checking",
 * by Jakobsson, Juels, and Rivest (11th Usenix Security Symposium, 2002).
 * 

* The algorithm used by this class differs from the one given in that it includes the length of the message in the hash calculation. *

*/ public class GeneralHashCommitter implements Committer { private final Digest digest; private final int byteLength; private final SecureRandom random; /** * Base Constructor. The maximum message length that can be org.testifyproject.testifyprojectmitted to is half the length of the internal * block size for the digest (ExtendedDigest.getBlockLength()). * * @param digest digest to use for creating org.testifyproject.testifyprojectmitments. * @param random source of randomness for generating secrets. */ public GeneralHashCommitter(ExtendedDigest digest, SecureRandom random) { this.digest = digest; this.byteLength = digest.getByteLength(); this.random = random; } /** * Generate a org.testifyproject.testifyprojectmitment for the passed in message. * * @param message the message to be org.testifyproject.testifyprojectmitted to, * @return a Commitment */ public Commitment org.testifyproject.testifyprojectmit(byte[] message) { if (message.length > byteLength / 2) { throw new DataLengthException("Message to be org.testifyproject.testifyprojectmitted to too large for digest."); } byte[] w = new byte[byteLength - message.length]; random.nextBytes(w); return new Commitment(w, calculateCommitment(w, message)); } /** * Return true if the passed in org.testifyproject.testifyprojectmitment represents a org.testifyproject.testifyprojectmitment to the passed in message. * * @param org.testifyproject.testifyprojectmitment a org.testifyproject.testifyprojectmitment previously generated. * @param message the message that was expected to have been org.testifyproject.testifyprojectmitted to. * @return true if org.testifyproject.testifyprojectmitment matches message, false otherwise. */ public boolean isRevealed(Commitment org.testifyproject.testifyprojectmitment, byte[] message) { if (message.length + org.testifyproject.testifyprojectmitment.getSecret().length != byteLength) { throw new DataLengthException("Message and witness secret lengths do not match."); } byte[] calcCommitment = calculateCommitment(org.testifyproject.testifyprojectmitment.getSecret(), message); return Arrays.constantTimeAreEqual(org.testifyproject.testifyprojectmitment.getCommitment(), calcCommitment); } private byte[] calculateCommitment(byte[] w, byte[] message) { byte[] org.testifyproject.testifyprojectmitment = new byte[digest.getDigestSize()]; digest.update(w, 0, w.length); digest.update(message, 0, message.length); digest.update((byte)((message.length >>> 8))); digest.update((byte)(message.length)); digest.doFinal(org.testifyproject.testifyprojectmitment, 0); return org.testifyproject.testifyprojectmitment; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy