source: trunk/CrypPlugins/KeySearcher/P2P/P2PBruteForce.cs @ 1671

Last change on this file since 1671 was 1671, checked in by Paul Lelgemann, 12 years ago

o Work on the distributed KeySearcher

File size: 4.4 KB
Line 
1using System;
2using System.Numerics;
3using Cryptool.PluginBase;
4using KeySearcher.Helper;
5using KeySearcher.P2P.Exceptions;
6using KeySearcher.P2P.Nodes;
7
8namespace KeySearcher.P2P
9{
10    class P2PBruteForce
11    {
12        private readonly KeySearcher _keySearcher;
13        private readonly KeySearcherSettings _settings;
14        private readonly KeyPatternPool _patternPool;
15        private readonly KeyPoolTree _keyPoolTree;
16
17        public P2PBruteForce(KeySearcher keySearcher, KeyPattern keyPattern, KeySearcherSettings settings, KeyQualityHelper keyQualityHelper)
18        {
19            _keySearcher = keySearcher;
20            _settings = settings;
21
22            // TODO when setting is still default (21), it is only displayed as 21 - but the settings-instance contains 0 for that key!
23            if (settings.ChunkSize == 0)
24            {
25                settings.ChunkSize = 21;
26            }
27
28            _patternPool = new KeyPatternPool(keyPattern, new BigInteger(Math.Pow(2, settings.ChunkSize)));
29            _keyPoolTree = new KeyPoolTree(_patternPool, _settings, _keySearcher, keyQualityHelper);
30
31            _keySearcher.GuiLogMessage(
32                "Total amount of patterns: " + _patternPool.Length + ", each containing " + _patternPool.PartSize +
33                " keys.", NotificationLevel.Info);
34
35            Leaf currentLeaf;
36            while (!_keySearcher.stop)
37            {
38                try
39                {
40                    currentLeaf = _keyPoolTree.FindNextLeaf();
41                    if (currentLeaf == null)
42                    {
43                        break;
44                    }
45                } catch(AlreadyCalculatedException)
46                {
47                    _keySearcher.GuiLogMessage("Node was already calculated.", NotificationLevel.Warning);
48                    _keyPoolTree.Reset();
49                    continue;
50                }
51
52                if (!currentLeaf.ReserveLeaf())
53                {
54                    _keySearcher.GuiLogMessage(
55                        "Pattern #" + currentLeaf.PatternId() +
56                        " was reserved before it could be reserved for this CrypTool instance.",
57                        NotificationLevel.Warning);
58                    _keyPoolTree.Reset();
59                    continue;
60                }
61
62                _keySearcher.GuiLogMessage(
63                    "Running pattern #" + (currentLeaf.PatternId() + 1) + " of " + _patternPool.Length,
64                    NotificationLevel.Info);
65
66                try
67                {
68                    var result = _keySearcher.BruteForceWithLocalSystem(_patternPool[currentLeaf.PatternId()]);
69
70                    if (!_keySearcher.stop)
71                    {
72                        _keyPoolTree.ProcessCurrentPatternCalculationResult(currentLeaf, result);
73                    }
74                    else
75                    {
76                        _keySearcher.GuiLogMessage("Brute force was stopped, not saving results...", NotificationLevel.Info);
77                    }
78
79                    _keySearcher.GuiLogMessage(
80                        string.Format("Best match: {0} with {1}", result.First.Value.key, result.First.Value.value),
81                        NotificationLevel.Info);               
82                }
83                catch(ReservationRemovedException)
84                {
85                    _keySearcher.GuiLogMessage("Reservation removed by another node (while calculating). " +
86                                               "To avoid a state in limbo, proceeding to first available leaf...",
87                                               NotificationLevel.Warning);
88                    _keyPoolTree.Reset();
89                    continue;
90                }
91                catch (UpdateFailedException e)
92                {
93                    _keySearcher.GuiLogMessage("Could not store results: " + e.Message, NotificationLevel.Warning);
94                    _keyPoolTree.Reset();
95                    continue;
96                }
97            }
98
99            // Set progress to 100%
100            if (!_keySearcher.stop && _keyPoolTree.IsCalculationFinished())
101            {
102                _keySearcher.showProgress(_keySearcher.costList, 1, 1, 1);
103                _keySearcher.GuiLogMessage("Calculation complete.", NotificationLevel.Info);
104            }
105        }
106    }
107}
Note: See TracBrowser for help on using the repository browser.