public bool ReCalculateHash(AICHHashAlgorithm hashalg, bool bDontReplace) { if (leftTree_ != null && rightTree_ != null) { if (!leftTree_.ReCalculateHash(hashalg, bDontReplace) || !rightTree_.ReCalculateHash(hashalg, bDontReplace)) { return(false); } if (bDontReplace && HashValid) { return(true); } if (rightTree_.HashValid && leftTree_.HashValid) { hashalg.Reset(); hashalg.Add(leftTree_.Hash.RawHash); hashalg.Add(rightTree_.Hash.RawHash); hashalg.Finish(Hash); hashValid_ = true; return(true); } else { return(HashValid); } } else { return(true); } }
public void SetBlockHash(ulong nSize, ulong nStartPos, AICHHashAlgorithm pHashAlg) { byte nLevel = 0; AICHHashTree pToInsert = FindHash(nStartPos, nSize, ref nLevel); if (pToInsert == null) { // sanity //TODO:Log //theApp.QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Critical Error: Failed to Insert SHA-HashBlock, FindHash() failed!")); return; } //sanity if (pToInsert.BaseSize != MuleConstants.EMBLOCKSIZE || pToInsert.DataSize != nSize) { //TODO:Log //theApp.QueueDebugLogLine(/*DLP_VERYHIGH,*/ false, _T("Critical Error: Logical error on values in SetBlockHashFromData")); return; } pHashAlg.Finish(pToInsert.Hash); pToInsert.HashValid = true; }
public bool VerifyHashTree(AICHHashAlgorithm hashalg, bool bDeleteBadTrees) { if (!HashValid) { if (bDeleteBadTrees) { leftTree_ = null; rightTree_ = null; } //TODO: Log //theApp.QueueDebugLogLine(/*DLP_HIGH,*/ false, _T("VerifyHashTree - No masterhash available")); return(false); } // calculated missing hashs without overwriting anything if (leftTree_ != null && !leftTree_.HashValid) { leftTree_.ReCalculateHash(hashalg, true); } if (rightTree_ != null && !rightTree_.HashValid) { rightTree_.ReCalculateHash(hashalg, true); } if ((rightTree_ != null && rightTree_.HashValid) ^ (leftTree_ != null && leftTree_.HashValid)) { // one branch can never be verified if (bDeleteBadTrees) { leftTree_ = null; rightTree_ = null; } //TODO: Log //theApp.QueueDebugLogLine(/*DLP_HIGH,*/ false, _T("VerifyHashSet failed - Hashtree incomplete")); return(false); } if ((rightTree_ != null && rightTree_.HashValid) && (leftTree_ != null && leftTree_.HashValid)) { // check verify the hashs of both child nodes against my hash AICHHash CmpHash = MuleApplication.Instance.AICHObjectManager.CreateAICHHash(); hashalg.Reset(); hashalg.Add(leftTree_.Hash.RawHash); hashalg.Add(rightTree_.Hash.RawHash); hashalg.Finish(CmpHash); if (!Hash.Equals(CmpHash)) { if (bDeleteBadTrees) { leftTree_ = null; rightTree_ = null; } return(false); } return(leftTree_.VerifyHashTree(hashalg, bDeleteBadTrees) && rightTree_.VerifyHashTree(hashalg, bDeleteBadTrees)); } else { // last hash in branch - nothing below to verify return(true); } }