public unsafe void DoubleHashTest()
{
foreach (var test in tests)
{
var data = Encoding.UTF8.GetBytes(test);
var work = Sha256.AllocateInputBuffer(Math.Max(data.Length, Sha256.SHA256_HASH_SIZE)); // enough space for original hash and hash of hash
var state = Sha256.AllocateStateBuffer();
var hash = Sha256.AllocateHashBuffer();
// reference data for comparison against
var refHash = sha256.ComputeHash(sha256.ComputeHash(data));
fixed (byte* dataPtr = data, workPtr = work, hashPtr = hash)
fixed (uint* statePtr = state)
{
// create working copy of data
Memory.Copy(dataPtr, workPtr, data.Length);
Sha256.Initialize(statePtr);
for (int i = 0; i < work.Length / Sha256.SHA256_BLOCK_SIZE; i++)
{
Sha256.Prepare(workPtr + i * Sha256.SHA256_BLOCK_SIZE, data.Length, i);
Sha256.Transform(statePtr, workPtr + i * Sha256.SHA256_BLOCK_SIZE);
}
// output first hash
Sha256.Finalize(statePtr, hashPtr);
// copy hash back to work, and hash aagin
Memory.Copy(hashPtr, workPtr, Sha256.SHA256_HASH_SIZE);
Sha256.Initialize(statePtr);
Sha256.Prepare(workPtr, Sha256.SHA256_HASH_SIZE, 0);
Sha256.Transform(statePtr, workPtr);
Sha256.Finalize(statePtr, hashPtr);
}
for (int i = 0; i < hash.Length; i++)
Assert.AreEqual(refHash[i], hash[i]);
}
}