示例#1
0
 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);
     }
 }
示例#2
0
        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;
        }
示例#3
0
        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);
            }
        }