Changeset 2539


Ignore:
Timestamp:
Jan 31, 2011, 1:03:15 PM (11 years ago)
Author:
Sven Rech
Message:

new distributed keysearcher data structure (and new error handling)

(by rech and nolte)

Location:
trunk/CrypPlugins/KeySearcher/P2P
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/KeySearcher/P2P/Storage/StorageHelper.cs

    r2522 r2539  
    22using System.Collections.Generic;
    33using System.IO;
     4using System.Security.Cryptography;
    45using System.Threading;
    56using Cryptool.P2P;
     
    3940            binaryWriter.Write('V');
    4041            binaryWriter.Write(version); 
    41 
    42             if (nodeToUpdate is Node)
    43             {
    44                 UpdateNodeInDht((Node) nodeToUpdate, binaryWriter);
    45             } else
    46             {
    47                 UpdateLeafInDht((Leaf) nodeToUpdate, binaryWriter);
    48             }
    4942
    5043            // Append results
     
    8679                }
    8780            }
    88             return StoreWithStatistic(KeyInDht(nodeToUpdate), memoryStream.ToArray());
     81           
     82            if (nodeToUpdate is Node)
     83            {
     84                binaryWriter.Write((byte)1);
     85                UpdateNodeInDht((Node)nodeToUpdate, binaryWriter);
     86            }
     87            else
     88            {
     89                binaryWriter.Write((byte)0);
     90                UpdateLeafInDht((Leaf)nodeToUpdate, binaryWriter);
     91            }
     92
     93            //return StoreWithStatistic(KeyInDht(nodeToUpdate), memoryStream.ToArray());
     94            return StoreWithHashAndStatistic(nodeToUpdate.DistributedJobIdentifier, KeyInDht(nodeToUpdate), memoryStream.ToArray());
     95        }
     96
     97        private RequestResult StoreWithHashAndStatistic(string jobid, string keyInDht, byte[] data)
     98        {
     99            SHA256 shaM = new SHA256Managed();
     100            List<byte> b = new List<byte>();
     101            b.AddRange(data);
     102            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
     103            b.AddRange(enc.GetBytes(jobid));
     104            var hash = shaM.ComputeHash(b.ToArray());
     105            List<byte> result = new List<byte>();
     106            result.AddRange(data);
     107            result.AddRange(hash);
     108            return StoreWithStatistic(keyInDht, result.ToArray());
     109        }
     110
     111        private bool InvalidHash(string jobid, byte[] nodeBytes)
     112        {
     113            if (nodeBytes.Length < 32)
     114                return false;
     115
     116            List<byte> b = new List<byte>();
     117            b.AddRange(nodeBytes);
     118            byte[] hash = b.GetRange(nodeBytes.Length - 32, 32).ToArray();
     119
     120            SHA256 shaM = new SHA256Managed();
     121            List<byte> c = b.GetRange(0, nodeBytes.Length - 32);
     122            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
     123            c.AddRange(enc.GetBytes(jobid));
     124            byte[] packethash = shaM.ComputeHash(c.ToArray());
     125
     126            for (int i = 0; i < 32; i++)
     127            {
     128                if (hash[i] != packethash[i])
     129                    return true;
     130            }
     131
     132            return false;
     133            //return !hash.Equals(packethash);
    89134        }
    90135
     
    115160                var requestResult = RetrieveWithStatistic(KeyInDht(nodeToUpdate));
    116161                var nodeBytes = requestResult.Data;
    117 
    118162                if (nodeBytes == null)
    119163                {
    120164                    return requestResult;
     165                }
     166
     167                if (InvalidHash(nodeToUpdate.DistributedJobIdentifier, nodeBytes))
     168                {
     169                    throw new Exception("Invalid Hash");
    121170                }
    122171
     
    125174                //oldVersionFlag will be used to garantee further changes in the Stream
    126175                var oldVersionFlag = CheckNodeVersion(binaryReader);
    127 
    128                 if (nodeToUpdate is Node)
    129                 {
    130                     UpdateNodeFromDht((Node)nodeToUpdate, binaryReader);
    131                 }
    132                 else
    133                 {
    134                     UpdateLeafFromDht((Leaf)nodeToUpdate, binaryReader);
    135                 }
    136176
    137177                // Load results
     
    181221                    }
    182222                }
     223
     224                byte type = binaryReader.ReadByte();
     225
     226                if (type == 1 && nodeToUpdate is Node)
     227                {
     228                    UpdateNodeFromDht((Node)nodeToUpdate, binaryReader);
     229                }
     230                else if (type == 0 && nodeToUpdate is Leaf)
     231                {
     232                    UpdateLeafFromDht((Leaf)nodeToUpdate, binaryReader);
     233                }
     234                else
     235                {
     236                    throw new Exception("Inconsistent type");
     237                }
     238
    183239               
    184240                if (resultCount > 0)
  • trunk/CrypPlugins/KeySearcher/P2P/Tree/Leaf.cs

    r2495 r2539  
    3838            if (IsCalculated())
    3939            {
    40                 throw new AlreadyCalculatedException();
     40                Reset();
    4141            }
    4242
     
    5151        public override void Reset()
    5252        {
    53             ParentNode.Reset();
     53            //ParentNode.Reset();
    5454            Result.Clear();
    5555            Activity.Clear();
    56             StorageHelper.UpdateInDht(this);
     56            if (!StorageHelper.UpdateInDht(this).IsSuccessful())
     57                throw new InvalidOperationException("Version mismatch");
    5758        }
    5859
  • trunk/CrypPlugins/KeySearcher/P2P/Tree/Node.cs

    r2442 r2539  
    7575            Result.Clear();
    7676            Activity.Clear();
    77             StorageHelper.UpdateInDht(this);
     77            UpdateCache();
     78            if (!StorageHelper.UpdateInDht(this).IsSuccessful())
     79                throw new InvalidOperationException("Version mismatch");
    7880        }
    7981
     
    9698            if (rightChild == null)
    9799            {
    98                 throw new AlreadyCalculatedException();
     100                Reset();
     101                return leftChild.CalculatableLeaf(useReservedNodes);
    99102            }
    100103
Note: See TracChangeset for help on using the changeset viewer.