public void VerifyHashGenerationV1(byte[] content, Content_Information_Data_Structure contentInfo)
{
const int BLOCKBYTECOUNT = 0x10000;
const int SEGMENTBLOCKCOUNT = 512;
dwHashAlgo_Values hashAlgo = contentInfo.dwHashAlgo;
int blockTotalCount = content.Length / BLOCKBYTECOUNT;
if (content.Length > BLOCKBYTECOUNT * blockTotalCount)
{
blockTotalCount = blockTotalCount + 1;
}
int segmentCount = blockTotalCount / SEGMENTBLOCKCOUNT;
if (blockTotalCount > SEGMENTBLOCKCOUNT * segmentCount)
{
segmentCount = segmentCount + 1;
}
HashAlgorithm hashAlgorithm;
HMAC hmacAlgorithm;
int blockHashSize;
PccrcUtility.GetHashAlgorithm(hashAlgo, out hashAlgorithm, out hmacAlgorithm, out blockHashSize);
hmacAlgorithm.Key = hashAlgorithm.ComputeHash(testConfig.ServerSecret);
for (int segmentIndex = 0; segmentIndex < segmentCount; segmentIndex++)
{
List<byte> blockHashList = new List<byte>();
int blockCount = (segmentIndex == segmentCount - 1) ? (blockTotalCount % SEGMENTBLOCKCOUNT) : (SEGMENTBLOCKCOUNT);
for (int blockIndex = 0; blockIndex < blockCount; blockIndex++)
{
var block = content.Skip(BLOCKBYTECOUNT * SEGMENTBLOCKCOUNT * segmentIndex + BLOCKBYTECOUNT * blockIndex).Take(BLOCKBYTECOUNT).ToArray();
byte[] blockHash = hashAlgorithm.ComputeHash(block);
testSite.Assert.IsTrue(
blockHash.SequenceEqual((contentInfo.blocks[segmentIndex].BlockHashes).Skip(blockIndex * blockHashSize).Take(blockHashSize).ToArray()),
"The local calculated block hash in Segment: {0} Block: {1} should cosistent with the received value.", segmentIndex, blockIndex);
blockHashList.AddRange(blockHash);
}
byte[] hod = hashAlgorithm.ComputeHash(blockHashList.ToArray());
testSite.Assert.IsTrue(
hod.SequenceEqual(contentInfo.segments[segmentIndex].SegmentHashOfData),
"The local calculated Hod should cosistent with the received value.");
byte[] kp = hmacAlgorithm.ComputeHash(hod);
testSite.Assert.IsTrue(
kp.SequenceEqual(contentInfo.segments[segmentIndex].SegmentSecret),
"The local calculated Kp should cosistent with the received value.");
}
}