Challenge and Proof

Later on, we will be given a Hunk called challenge. We will define challenge_id = challenge.evaporate().

The terminator again

Next, we will need to successively hash challenge_id with Hunk::hash() and Hunk::evaporate() until it matches our terminating condition. We'll call the final value end.

If it never matches our terminating condition (IE, it loops), we will take the hashes of all items in the loop, xor them together, and that becomes the new challenge.

end = end

We also have a file called end. We can read all rainbow tables that have a final hash that matches our end. Note that this organization was useful, because this is a sequential read to find all rainbow tables.

start

Now, we have a bunch of start values for a bunch of rainbow tables. For each hash in each chain, find hash ^ challenge and keep the smallest one (as a Hunk read as a big endian integer).

Proof

The start value is the proof, along with all RainbowParams.

Verify

Others will need to verify that you actually had a rainbow table.

They will take challenge and convert it to a end the same way you did. (2^z hashes)

They will take the start and turn it into end the same way you did. (2^z hashes)

And, they will find the smallest proof at the same time.