Changeset 277 for trunk/CrypPlugins/LFSR


Ignore:
Timestamp:
Apr 8, 2009, 9:07:02 PM (13 years ago)
Author:
Sören Rinne
Message:
  • updated LFSR
  • added CLK plugin (not very potent yet)
Location:
trunk/CrypPlugins/LFSR
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/LFSR/LFSR.cs

    r272 r277  
    1818    [PluginInfo(false, "LFSR", "Linear Feedback Shift Register (simple version)", "LFSR/DetailedDescription/Description.xaml", "LFSR/Images/LFSR.png", "LFSR/Images/encrypt.png", "LFSR/Images/decrypt.png")]
    1919    [EncryptionType(EncryptionType.SymmetricBlock)]
    20     public class LFSR : IEncryption
     20    public class LFSR : IThroughput
    2121    {
    2222        #region IPlugin Members
    2323
    2424        private LFSRSettings settings;
    25         private String inputFeedback;
     25        private String inputTapSequence;
    2626        private String inputSeed;
    2727        private CryptoolStream inputClock;
    2828        private CryptoolStream outputStream;
     29        private bool outputBool;
     30        private bool inputClockBool;
    2931        private bool stop = false;
     32        //private bool getNewSeed = true;
    3033        private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
    3134
     
    4447        }
    4548
    46         [PropertyInfo(Direction.Input, "Feedback", "Feedback function in binary presentation.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
    47         public String InputFeedback
    48         {
    49             get { return inputFeedback; }
     49        [PropertyInfo(Direction.Input, "TapSequence", "TapSequence function in binary presentation.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
     50        public String InputTapSequence
     51        {
     52            get { return inputTapSequence; }
    5053            set
    5154            {
    52                 inputFeedback = value;
    53                 OnPropertyChanged("InputFeedback");
    54             }
    55         }
    56 
    57         [PropertyInfo(Direction.Input, "Seed", "Seed of the LFSR in binary presentation.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
     55                inputTapSequence = value;
     56                OnPropertyChanged("InputTapSequence");
     57            }
     58        }
     59
     60        [PropertyInfo(Direction.Input, "Seed", "Seed of the LFSR in binary presentation.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
    5861        public String InputSeed
    5962        {
     
    6669        }
    6770
    68         [PropertyInfo(Direction.Input, "Clock", "Optional clock input. LFSR only advances if clock is true.", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
     71        [PropertyInfo(Direction.Input, "Clock", "Optional clock input. LFSR only advances if clock is 1.", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
    6972        public CryptoolStream InputClock
    7073        {
     
    8891        }
    8992
     93        [PropertyInfo(Direction.Input, "Clock", "Optional clock input. LFSR only advances if clock is true.", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
     94        public Boolean InputClockBool
     95        {
     96            get { return inputClockBool; }
     97            set
     98            {
     99                inputClockBool = value;
     100                OnPropertyChanged("InputClockBool");
     101            }
     102        }
     103
    90104        [PropertyInfo(Direction.Output, "Output stream", "LFSR Output Stream", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
    91105        public CryptoolStream OutputStream
     
    110124        }
    111125
     126        [PropertyInfo(Direction.Output, "Boolean Output", "Boolean Output.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
     127        public bool OutputBool
     128        {
     129            get { return outputBool; }
     130            set
     131            {
     132                OutputBool = (bool)value;
     133                OnPropertyChanged("OutputBool");
     134            }
     135        }
     136
    112137        public void Dispose()
    113138        {
     
    117142                outputStream = null;
    118143                inputClock = null;
     144                inputTapSequence = null;
     145                inputSeed = null;
    119146
    120147                if (inputClock != null)
     
    144171        }
    145172
    146         private void checkForInputFeedback()
    147         {
    148             if ((inputFeedback == null || (inputFeedback != null && inputFeedback.Length == 0)))
     173        private void checkForInputTapSequence()
     174        {
     175            if ((inputTapSequence == null || (inputTapSequence != null && inputTapSequence.Length == 0)))
    149176            {
    150177                //create some input
    151                 String dummystring = "1";
    152 //                this.inputFeedback = new String();
    153                 inputFeedback = dummystring;
     178                String dummystring = "1011";
     179//                this.inputTapSequence = new String();
     180                inputTapSequence = dummystring;
    154181                // write a warning to the outside world
    155                 GuiLogMessage("WARNING - No Feedback provided. Using dummy data. (" + dummystring + ")", NotificationLevel.Warning);
     182                GuiLogMessage("WARNING - No TapSequence provided. Using dummy data. (" + dummystring + ")", NotificationLevel.Warning);
    156183            }
    157184        }
     
    162189            {
    163190                //create some input
    164                 String dummystring = "10100";
     191                String dummystring = "1010";
    165192                //this.inputSeed = new CryptoolStream();
    166193                inputSeed = dummystring;
     
    179206                this.inputClock.OpenRead(this.GetPluginInfoAttribute().Caption, Encoding.Default.GetBytes(dummystring.ToCharArray()));
    180207                // write a warning to the outside world
    181                 GuiLogMessage("WARNING - No clock provided. Asuming always 1.", NotificationLevel.Warning);
    182             }
     208                GuiLogMessage("FYI - No clock provided. Asuming always 1.", NotificationLevel.Info);
     209            }
     210        }
     211
     212        private bool checkForClockEvent()
     213        {
     214            // checks if current event is a clock event
     215            //PropertyChangingEventArgs.??
     216            return true;
    183217        }
    184218
     
    194228            try
    195229            {
    196                 checkForInputFeedback();
     230                //if (!checkForClockEvent()) return;
     231                checkForInputTapSequence();
    197232                checkForInputSeed();
    198                 checkForInputClock();
    199233
    200234                if (inputSeed == null || (inputSeed != null && inputSeed.Length == 0))
     
    204238                }
    205239
    206                 if (inputFeedback == null || (inputFeedback != null && inputFeedback.Length == 0))
    207                 {
    208                     GuiLogMessage("No Feedback given. Aborting now.", NotificationLevel.Error);
     240                if (inputTapSequence == null || (inputTapSequence != null && inputTapSequence.Length == 0))
     241                {
     242                    GuiLogMessage("No TapSequence given. Aborting now.", NotificationLevel.Error);
    209243                    return;
    210244                }
    211245
    212                 if (inputFeedback.Length != inputSeed.Length)
    213                 {
    214                     // stop, because seed and feedback must have same length
    215                     GuiLogMessage("ERROR - Seed and feedback must have same length. Aborting now.", NotificationLevel.Error);
     246                if (inputTapSequence.Length != inputSeed.Length)
     247                {
     248                    // stop, because seed and tapSequence must have same length
     249                    GuiLogMessage("ERROR - Seed and tapSequence must have same length. Aborting now.", NotificationLevel.Error);
    216250                    return;
    217251                }
    218252
    219                 int feedbackBits = inputFeedback.Length;
     253                int tapSequenceBits = inputTapSequence.Length;
    220254                int seedBits = inputSeed.Length;
    221255
    222                 GuiLogMessage("inputFeedback length [bits]: " + feedbackBits.ToString(), NotificationLevel.Debug);
     256                GuiLogMessage("inputTapSequence length [bits]: " + tapSequenceBits.ToString(), NotificationLevel.Debug);
    223257                GuiLogMessage("inputSeed length [bits]: " + seedBits.ToString(), NotificationLevel.Debug);
    224258               
    225                 String seedbuffer;
    226                 String feedbackbuffer;
     259                String seedbuffer = "0";
     260                String tapSequencebuffer;
    227261                Char outputbuffer;
    228262
    229                 //read seed
     263                //read seed one time until stop of chain
     264                /*if (getNewSeed)
     265                {
     266                    seedbuffer = inputSeed;
     267                    getNewSeed = false;
     268                }*/
    230269                seedbuffer = inputSeed;
    231270               
    232                 // read feedback
    233                 feedbackbuffer = inputFeedback;
    234 
    235                 // convert feedback into char array
    236                 char[] feedbackCharArray = feedbackbuffer.ToCharArray();
    237 
    238                 // check if feedback is binary
    239                 foreach (char character in feedbackCharArray)
     271                // read tapSequence
     272                tapSequencebuffer = inputTapSequence;
     273
     274                // convert tapSequence into char array
     275                char[] tapSequenceCharArray = tapSequencebuffer.ToCharArray();
     276
     277                // check if tapSequence is binary
     278                foreach (char character in tapSequenceCharArray)
    240279                {
    241280                    if (character != '0' && character != '1')
    242281                    {
    243                         GuiLogMessage("ERROR 0 - Feedback has to be binary. Aborting now. Character is: " + character, NotificationLevel.Error);
     282                        GuiLogMessage("ERROR 0 - TapSequence has to be binary. Aborting now. Character is: " + character, NotificationLevel.Error);
    244283                        return;
    245284                    }
     
    264303                outputStream.OpenWrite(this.GetPluginInfoAttribute().Caption);
    265304
    266                 // open clock
    267 
     305               
     306
     307                // check which clock to use
     308                Boolean myClock = true;
     309
     310                if (settings.UseBoolClock)
     311                {
     312                    myClock = inputClockBool;
     313                }
     314                else if (!settings.UseBoolClock)
     315                {
     316                    // read stream clocks
     317                    checkForInputClock();
     318                    String stringClock = inputClock.ReadByte().ToString();
     319                    inputClock.Position = 0;
     320                    if (String.Equals(stringClock, "49")) myClock = true; else myClock = false;
     321                }
     322
     323                // check if Rounds are given
     324                int defaultRounds = 4;
     325                int actualRounds;
     326
     327                // check if Rounds in settings are given
     328                if (settings.Rounds == 0) actualRounds = defaultRounds; else actualRounds = settings.Rounds;
    268329               
    269330                // Here we go!
    270                 GuiLogMessage("Action is: Now!", NotificationLevel.Debug);
     331                //GuiLogMessage("Action is: Now!", NotificationLevel.Debug);
    271332                DateTime startTime = DateTime.Now;
    272333
    273334                // compute LFSR
    274                 if (true)
    275                 {
    276                     GuiLogMessage("Starting computation", NotificationLevel.Info);
    277                    
    278                     int i = 0;
    279                     int defaultRounds = 4;
    280                     int actualRounds;
    281 
    282                     // check if Rounds are given
    283                     if (settings.Rounds == 0) actualRounds = defaultRounds; else actualRounds = settings.Rounds;
    284 
    285                     for (i = 0; i < actualRounds; i++)
     335                GuiLogMessage("Starting computation", NotificationLevel.Info);
     336               
     337                int i = 0;
     338               
     339                for (i = 0; i < actualRounds; i++)
     340                {
     341                    // compute only if clock = 1 or true
     342                    if (myClock)
    286343                    {
    287                         //StatusChanged((int)LFSRImage.Encode);
    288 
    289                         // compute only if clock = 1
    290                         String clock = inputClock.ReadByte().ToString();
    291                         inputClock.Position = 0;
    292                         //GuiLogMessage("Clock is: " + clock, NotificationLevel.Info);
    293 
    294                         // check if clock is 1, which is 0x49 in ASCII
    295                         if (String.Equals(clock, "49"))
     344                        StatusChanged((int)LFSRImage.Encode);
     345
     346                        // write last bit to output buffer, stream and bool
     347                        outputbuffer = seedCharArray[seedBits - 1];
     348                        outputStream.Write((Byte)outputbuffer);
     349                        // update output stream
     350                        OnPropertyChanged("OutputStream");
     351                        // make bool output
     352                        if (outputbuffer == '0') outputBool = false; else outputBool = true;
     353                        // update bool output
     354                        OnPropertyChanged("OutputBool");
     355
     356                        // shift seed array
     357                        char newBit = '0';
     358
     359                        // compute new bit
     360                        bool firstDone = false;
     361                        for (int j = 0; j < seedBits; j++)
    296362                        {
    297                             // write last bit to output buffer and stream
    298                             outputbuffer = seedCharArray[seedBits - 1];
    299                             outputStream.Write((Byte)outputbuffer);
    300                             // update output stream
    301                             OnPropertyChanged("OutputStream");
    302 
    303                             // shift seed array
    304                             char newBit = '0';
    305 
    306                             // compute new bit
    307                             bool firstDone = false;
    308                             for (int j = 0; j < seedBits; j++)
     363                            // check if tapSequence is 1
     364                            if (tapSequenceCharArray[j] == '1')
    309365                            {
    310                                 // check if feedback is 1
    311                                 if (feedbackCharArray[j] == '1')
     366                                // if it is the first one, just take it
     367                                if (!firstDone)
    312368                                {
    313                                     // if it is the first one, just take it
    314                                     if (!firstDone)
    315                                     {
    316                                         newBit = seedCharArray[j];
    317                                         firstDone = true;
    318                                     }
    319                                     // do an XOR with the first one
    320                                     else
    321                                     {
    322                                         newBit = (newBit ^ seedCharArray[j]).ToString()[0];
    323                                     }
     369                                    newBit = seedCharArray[j];
     370                                    firstDone = true;
     371                                }
     372                                // do an XOR with the first one
     373                                else
     374                                {
     375                                    newBit = (newBit ^ seedCharArray[j]).ToString()[0];
    324376                                }
    325377                            }
    326 
    327                             // shift seed array
    328                             for (int j = seedBits - 1; j > 0; j--)
    329                             {
    330                                 seedCharArray[j] = seedCharArray[j - 1];
    331                             }
    332                             seedCharArray[0] = newBit;
    333 
    334                             //GuiLogMessage("New Bit: " + newBit.ToString(), NotificationLevel.Info);
    335378                        }
    336                         else
     379
     380                        // shift seed array
     381                        for (int j = seedBits - 1; j > 0; j--)
    337382                        {
    338                             StatusChanged((int)LFSRImage.Decode);
    339                             GuiLogMessage("LFSR Clock is 0", NotificationLevel.Info);
    340                             return;
     383                            seedCharArray[j] = seedCharArray[j - 1];
    341384                        }
    342                        
     385                        seedCharArray[0] = newBit;
     386
     387                        // write current "seed" back to seedbuffer
     388                        //seedbuffer = seedCharArray.ToString();
     389
     390                        //GuiLogMessage("New Bit: " + newBit.ToString(), NotificationLevel.Info);
    343391                    }
     392                    else
     393                    {
     394                        StatusChanged((int)LFSRImage.Decode);
     395                        //GuiLogMessage("LFSR Clock is 0, no computation.", NotificationLevel.Info);
     396                        //return;
     397                    }
     398                   
    344399                }
    345400
     
    351406                if (!stop)
    352407                {
    353                     GuiLogMessage("Complete!", NotificationLevel.Debug);
    354 
    355                     GuiLogMessage("Time used: " + duration, NotificationLevel.Debug);
     408                    GuiLogMessage("Complete!", NotificationLevel.Info);
     409
     410                    GuiLogMessage("Time used: " + duration, NotificationLevel.Info);
    356411                    outputStream.Close();
     412                    if (!settings.UseBoolClock) inputClock.Close();
    357413                    OnPropertyChanged("OutputStream");
    358414                }
     
    361417                {
    362418                    outputStream.Close();
    363                     GuiLogMessage("Aborted!", NotificationLevel.Debug);
     419                    if (!settings.UseBoolClock) inputClock.Close();
     420                    GuiLogMessage("Aborted!", NotificationLevel.Info);
    364421                }
    365422            }
     
    421478        {
    422479            StatusChanged((int)LFSRImage.Default);
     480            //getNewSeed = true;
    423481            this.stop = true;
    424482        }
  • trunk/CrypPlugins/LFSR/LFSRSettings.cs

    r272 r277  
    2121
    2222        private bool hasChanges = false;
     23       
    2324        private int rounds = 4; //how many bits will be generated
    24 
    25         //[ContextMenu("Rounds","How many bits shall be generated?",1, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, new int[] { 5, 10}, "5 bits","10 bits")]
    26         [TaskPane("Rounds", "How many bits shall be generated?", null, 1, false, DisplayLevel.Beginner, ControlType.TextBox)]
     25        //[ContextMenu("Rounds", "How many bits shall be generated?", 1, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, new int[] { 10, 50, 100 }, "10 bits", "50 bits", "100 bits")]
     26        //[TaskPane("Rounds", "How many bits shall be generated?", null, 1, false, DisplayLevel.Beginner, ControlType.TextBox)]
     27        [TaskPane("Rounds", "How many bits shall be generated?", null, 0, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, int.MaxValue)]
    2728        public int Rounds
    2829        {
    2930            get { return this.rounds; }
    3031            set {
    31                 this.rounds = (int)value;
     32                this.rounds = value;
    3233                OnPropertyChanged("Rounds");
     34                HasChanges = true;
     35            }
     36        }
     37
     38        private bool useBoolClock = false;
     39        [ContextMenu("Use BoolClock", "With this checkbox enabled, BoolClock will be used.", 0, DisplayLevel.Experienced, ContextMenuControlType.CheckBox, null, new string[] { "Use Boolean clock?" })]
     40        [TaskPane("Use BoolClock", "With this checkbox enabled, BoolClock will be used.", null, 1, false, DisplayLevel.Beginner, ControlType.CheckBox, "", null)]
     41        public bool UseBoolClock
     42        {
     43            get { return this.useBoolClock; }
     44            set
     45            {
     46                this.useBoolClock = (bool)value;
     47                OnPropertyChanged("UseBoolClock");
    3348                HasChanges = true;
    3449            }
Note: See TracChangeset for help on using the changeset viewer.