Changeset 292


Ignore:
Timestamp:
Apr 20, 2009, 5:10:33 PM (13 years ago)
Author:
Sören Rinne
Message:
  • added binary AND
  • added Boolean to Integer converter
  • added Majority plugin
  • changed LFSR a bit
Location:
trunk/CrypPlugins
Files:
36 added
3 edited

Legend:

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

    r289 r292  
    3838        private bool outputBool;
    3939        private bool inputClockBool;
     40        private bool outputClockingBit;
    4041       
    4142        private LFSRPresentation lFSRPresentation;
     
    167168                outputBool = (bool)value;
    168169                OnPropertyChanged("OutputBool");
     170            }
     171        }
     172
     173        [PropertyInfo(Direction.Output, "Clocking Bit Output", "Clocking Bit Output.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
     174        public bool OutputClockingBit
     175        {
     176            get { return outputClockingBit; }
     177            set
     178            {
     179                outputClockingBit = (bool)value;
     180                OnPropertyChanged("OutputClockingBit");
    169181            }
    170182        }
     
    310322        }
    311323
     324        // Function to turn around tapSequence (01101 -> 10110)
     325        private char[] TurnAround(char[] tapSequence)
     326        {
     327            //String tempString = new String(tapSequence);
     328            //GuiLogMessage("tapSequence before = " + tempString, NotificationLevel.Info);
     329            char[] tempCharArray = new char[tapSequence.Length];
     330
     331            int temp;
     332            for (int j = tapSequence.Length - 1; j >= 0; j--)
     333            {
     334                temp = (j - tapSequence.Length + 1) % (tapSequence.Length);
     335                if (temp < 0) temp *= -1;
     336                //GuiLogMessage("temp = " + temp, NotificationLevel.Info);
     337                tempCharArray[j] = tapSequence[temp];
     338            }
     339            //tempString = new String(tempCharArray);
     340            //GuiLogMessage("tapSequence after = " + tempString, NotificationLevel.Info);
     341            return tempCharArray;
     342        }
     343
    312344        #endregion
    313345
     
    343375                // read tapSequence
    344376                tapSequencebuffer = inputTapSequence;
    345 
    346                 // convert tapSequence into char array
    347                 char[] tapSequenceCharArray = tapSequencebuffer.ToCharArray();
    348377               
    349378                // check if tapSequence is binary
    350379                bool tapSeqisBool = true;
    351                 foreach (char character in tapSequenceCharArray)
     380                foreach (char character in tapSequencebuffer)
    352381                {
    353382                    if (character != '0' && character != '1')
     
    369398
    370399                        // check if polynomial has false length
    371                         if (tapSequencebuffer.Length != inputSeed.Length) {
    372                             // check if its too long
     400                        if (tapSequencebuffer.Length != inputSeed.Length)
     401                        {
     402                            /*// check if its too long
    373403                            if (inputSeed.Length - tapSequencebuffer.Length < 0)
    374404                            {
     
    384414                                    tapSequencebuffer = "0" + tapSequencebuffer;
    385415                                }
    386                             }
     416                            }*/
     417                            GuiLogMessage("ERROR - Your polynomial " + tapSequencebuffer + " has to be the same length (" + tapSequencebuffer.Length + " Bits) as your seed (" + inputSeed.Length + " Bits). Aborting now.", NotificationLevel.Error);
     418                            if (!settings.UseBoolClock) inputClock.Close();
     419                            return;
    387420                        }
    388421
    389                         GuiLogMessage("Polynomial after length fitting: " + tapSequencebuffer, NotificationLevel.Info);
    390                         tapSequenceCharArray = tapSequencebuffer.ToCharArray();
     422                        //GuiLogMessage("Polynomial after length fitting: " + tapSequencebuffer, NotificationLevel.Info);
    391423                    }
    392424                    else
     
    399431                }
    400432
     433                // convert tapSequence into char array
     434                char[] tapSequenceCharArray = TurnAround(tapSequencebuffer.ToCharArray());
     435
    401436                if (tapSequencebuffer.Length != inputSeed.Length)
    402437                {
     
    420455                }
    421456
    422                 //check if last tap is 1, otherwise stop
     457                //check if last and first tap is 1, otherwise stop
    423458                if (tapSequenceCharArray[tapSequenceCharArray.Length - 1] == '0')
    424459                {
    425                     GuiLogMessage("ERROR - Last tap of tapSequence must 1. Aborting now.", NotificationLevel.Error);
     460                    GuiLogMessage("ERROR - Last tap of tapSequence must be 1. Aborting now.", NotificationLevel.Error);
     461                    return;
     462                }
     463                else if (tapSequenceCharArray[0] == '0')
     464                {
     465                    GuiLogMessage("ERROR - First tap of tapSequence must be 1. Aborting now.", NotificationLevel.Error);
    426466                    return;
    427467                }
     
    439479                    }
    440480                }
    441 
    442                 lFSRPresentation.DrawLFSR(seedCharArray, tapSequenceCharArray);
     481                int clocking;
     482                if (settings.UseClockingBit) clocking = settings.ClockingBit; else clocking = -1;
     483                lFSRPresentation.DrawLFSR(seedCharArray, tapSequenceCharArray, clocking);
    443484
    444485                // open output stream
     
    514555                        // compute new bit
    515556                        bool firstDone = false;
    516                         for (int j = 0; j < seedBits; j++)
     557                        for (int j = 1; j < seedBits; j++)
    517558                        {
    518559                            // check if tapSequence is 1
     
    525566                                    firstDone = true;
    526567                                }
    527                                 // do an XOR with the first one
     568                                // or do an XOR with the last computed bit
    528569                                else
    529570                                {
     
    554595                    {
    555596                        StatusChanged((int)LFSRImage.Decode);
     597
     598                        if (settings.AlwaysCreateOutput)
     599                        {
     600                            /////////
     601                            // but nevertheless fire an output event with old value
     602                            /////////
     603                            // make bool output
     604                            if (seedCharArray[seedBits - 1] == '0') outputBool = false;
     605                            else outputBool = true;
     606                            //GuiLogMessage("OutputBool is: " + outputBool.ToString(), NotificationLevel.Info);
     607
     608                            // write last bit to output buffer, stream and bool
     609                            outputbuffer = seedCharArray[seedBits - 1];
     610                            outputStream.Write((Byte)outputbuffer);
     611
     612                            OnPropertyChanged("OutputBool");
     613                            OnPropertyChanged("OutputStream");
     614
     615                            //update quickwatch presentation
     616                            lFSRPresentation.FillBoxes(seedCharArray, tapSequenceCharArray, seedCharArray[seedBits - 1]);
     617                            /////////
     618                        }
     619                        else
     620                        {
     621                            // update quickwatch with current state but without any output bit
     622                            lFSRPresentation.FillBoxes(seedCharArray, tapSequenceCharArray, ' ');
     623                        }
     624
    556625                        //GuiLogMessage("LFSR Clock is 0, no computation.", NotificationLevel.Info);
    557626                        //return;
    558627                    }
    559                    
     628                    // in both cases update "clocking bit" if set in settings
     629                    if (settings.UseClockingBit)
     630                    {
     631                        // make clocking bit output
     632                        if (seedCharArray[settings.ClockingBit] == '0') outputClockingBit = false;
     633                        else outputClockingBit = true;
     634                        OnPropertyChanged("OutputClockingBit");
     635                    }
    560636                }
    561637
  • trunk/CrypPlugins/LFSR/LFSRPresentation.xaml.cs

    r285 r292  
    4040        }
    4141
    42         public void DrawLFSR(char[] state, char[] tapSequence)
     42        public void DrawLFSR(char[] state, char[] tapSequence, int clockingBit)
    4343        {
    4444            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     
    6161                HoriLine2.X1 = 5;
    6262                HoriLine2.Y1 = 47;
    63                 HoriLine2.X2 = 30 + state.Length * 30;
     63                HoriLine2.X2 = 35 + (state.Length - 1) * 29;
    6464                HoriLine2.Y2 = 47;
    6565                HoriLine2.Stroke = Brushes.Black;
     
    7777
    7878                Line VertLine2 = new Line();
    79                 VertLine2.X1 = 30 + state.Length * 30;
    80                 VertLine2.Y1 = 17.5;
    81                 VertLine2.X2 = 30 + state.Length * 30;
    82                 VertLine2.Y2 = 47.5;
     79                VertLine2.X1 = 35 + (state.Length - 1) * 29;
     80                VertLine2.Y1 = 32;
     81                VertLine2.X2 = 35 + (state.Length - 1) * 29;
     82                VertLine2.Y2 = 47;
    8383                VertLine2.Stroke = Brushes.Black;
    8484                VertLine2.StrokeThickness = 1;
     
    8686
    8787                // add connection circle
    88                 Ellipse ConnectionCircle = new Ellipse();
     88                /*Ellipse ConnectionCircle = new Ellipse();
    8989                ConnectionCircle.HorizontalAlignment = HorizontalAlignment.Left;
    9090                ConnectionCircle.VerticalAlignment = VerticalAlignment.Top;
     
    9393                ConnectionCircle.Height = 4;
    9494                ConnectionCircle.Margin = new Thickness(27.5 + state.Length * 30, 15.5, 0, 0);
    95                 myGrid.Children.Add(ConnectionCircle);
     95                myGrid.Children.Add(ConnectionCircle);*/
    9696
    9797                // add left triangle ////////////////////
     
    173173                Grid[] myGrids = new Grid[state.Length];
    174174                Ellipse[] myEllipses = new Ellipse[state.Length];
    175                 Line[] myLines = new Line[state.Length];
     175                Line[] myLinesVert = new Line[state.Length];
     176                Line[] myLinesVertRed = new Line[state.Length];
     177                Line[] myLinesHori = new Line[state.Length];
    176178
    177179                // add TextBoxes
     
    195197                    myTextBoxes[i].VerticalContentAlignment = VerticalAlignment.Center;
    196198                    myTextBoxes[i].BorderBrush = Brushes.Black;
    197                     if (i % 2 != 0) myTextBoxes[i].Background = Brushes.LightGray;
     199                    //if (i % 2 != 0) myTextBoxes[i].Background = Brushes.Lavender;
     200                    if (i != 0)
     201                    {
     202                        if (tapSequence[i] == '1') myTextBoxes[i].Background = Brushes.DodgerBlue;
     203                    }
     204                    if (clockingBit == i) myTextBoxes[i].Background = Brushes.Orange;
    198205
    199206                    myGrid.Children.Add(myTextBoxes[i]);
     
    215222                        myEllipses[i] = new Ellipse();
    216223                        myEllipses[i].Name = "ellipseXOR" + i;
    217                         myEllipses[i].Stroke = Brushes.Black;
     224                        myEllipses[i].Stroke = Brushes.DodgerBlue;
    218225                        myEllipses[i].Margin = new Thickness(9, 9, 9, 9);
    219226
    220                         myLines[i] = new Line();
    221                         myLines[i].Name = "VertLineXOR" + i;
    222                         myLines[i].Stroke = Brushes.Black;
    223                         myLines[i].StrokeThickness = 1;
    224                         myLines[i].X1 = 15;
    225                         myLines[i].Y1 = 0.5;
    226                         myLines[i].X2 = 15;
    227                         myLines[i].Y2 = 20;
     227                        myLinesVert[i] = new Line();
     228                        myLinesVert[i].Name = "VertLineXOR" + i;
     229                        myLinesVert[i].Stroke = Brushes.Black;
     230                        myLinesVert[i].StrokeThickness = 1;
     231                        myLinesVert[i].X1 = 15;
     232                        myLinesVert[i].Y1 = 0.5;
     233                        myLinesVert[i].X2 = 15;
     234                        myLinesVert[i].Y2 = 9;
     235
     236                        myLinesVertRed[i] = new Line();
     237                        myLinesVertRed[i].Name = "VertLineXORRed" + i;
     238                        myLinesVertRed[i].Stroke = Brushes.DodgerBlue;
     239                        myLinesVertRed[i].StrokeThickness = 1;
     240                        myLinesVertRed[i].X1 = 15;
     241                        myLinesVertRed[i].Y1 = 9;
     242                        myLinesVertRed[i].X2 = 15;
     243                        myLinesVertRed[i].Y2 = 20;
     244
     245                        myLinesHori[i] = new Line();
     246                        myLinesHori[i].Name = "HoriLineXOR" + i;
     247                        myLinesHori[i].Stroke = Brushes.DodgerBlue;
     248                        myLinesHori[i].StrokeThickness = 1;
     249                        myLinesHori[i].X1 = 9;
     250                        myLinesHori[i].Y1 = 15;
     251                        myLinesHori[i].X2 = 20;
     252                        myLinesHori[i].Y2 = 15;
    228253
    229254                        myGrids[i].Children.Add(myEllipses[i]);
    230                         myGrids[i].Children.Add(myLines[i]);
     255                        myGrids[i].Children.Add(myLinesVert[i]);
     256                        myGrids[i].Children.Add(myLinesVertRed[i]);
     257                        myGrids[i].Children.Add(myLinesHori[i]);
    231258                    }
    232259                }
    233                 // disable last XOR
    234                 myGrids[i-1].Visibility = Visibility.Hidden;
     260                // disable last and first XOR
     261                myGrids[0].Visibility = Visibility.Hidden;
     262                myGrids[state.Length - 1].Visibility = Visibility.Hidden;
    235263
    236264                // add output bit label
     
    244272                outPutLabel.HorizontalAlignment = HorizontalAlignment.Left;
    245273                outPutLabel.VerticalAlignment = VerticalAlignment.Top;
     274                outPutLabel.Name = "outputLabel";
    246275                myGrid.Children.Add(outPutLabel);
    247276
     
    255284            Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    256285            {
    257                 // get the textboxes as children of myGrid. textboxes are 7, 9, 11, ...
     286                // get the textboxes as children of myGrid. textboxes are 6 + 2 + 2 + ... [don't forget to change line 314, Col 73]
    258287                Visual childVisual;
    259288                int i;
     
    261290                for (i = 0; i < state.Length; i++)
    262291                {
    263                     childVisual = (Visual)VisualTreeHelper.GetChild(myGrid, 7 + i * 2);
     292                    childVisual = (Visual)VisualTreeHelper.GetChild(myGrid, 6 + i * 2);
    264293                    childVisual.SetValue(TextBox.TextProperty, state[i].ToString());
    265                    
     294
     295                    /*
     296                    // this only seems to work for children not added at runtime
     297                    Label myInfoText = myGrid.FindName("infoText") as Label;
     298                    if (myInfoText != null)
     299                    {
     300                        myInfoText.Background = Brushes.DodgerBlue;
     301                    }*/
     302
    266303                    //build polynomial
    267304                    int power;
     
    276313
    277314                // update output label
    278                 childVisual = (Visual)VisualTreeHelper.GetChild(myGrid, 9 + (i-1) * 2);
     315                childVisual = (Visual)VisualTreeHelper.GetChild(myGrid, 8 + (i-1) * 2);
    279316                childVisual.SetValue(Label.ContentProperty, output);
    280317
  • trunk/CrypPlugins/LFSR/LFSRSettings.cs

    r288 r292  
    3636        }
    3737
     38        private int clockingBit = 0;
     39        [TaskPane("Clocking Bit", "Which bit shall be generated as an additional output? For example as an clocking bit.", null, 0, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, int.MaxValue)]
     40        public int ClockingBit
     41        {
     42            get { return this.clockingBit; }
     43            set
     44            {
     45                this.clockingBit = value;
     46                OnPropertyChanged("ClockingBit");
     47                HasChanges = true;
     48            }
     49        }
     50
     51        private bool useClockingBit = false;
     52        [ContextMenu("Use ClockingBit", "With this checkbox enabled, the clocking bit will be generated.", 0, DisplayLevel.Experienced, ContextMenuControlType.CheckBox, null, new string[] { "Use clocking bit?" })]
     53        [TaskPane("Use ClockingBit", "With this checkbox enabled, clocking bit will be generated.", null, 1, false, DisplayLevel.Beginner, ControlType.CheckBox, "", null)]
     54        public bool UseClockingBit
     55        {
     56            get { return this.useClockingBit; }
     57            set
     58            {
     59                this.useClockingBit = (bool)value;
     60                OnPropertyChanged("UseClockingBit");
     61                HasChanges = true;
     62            }
     63        }
     64
    3865        private bool useBoolClock = false;
    3966        [ContextMenu("Use BoolClock", "With this checkbox enabled, BoolClock will be used.", 0, DisplayLevel.Experienced, ContextMenuControlType.CheckBox, null, new string[] { "Use Boolean clock?" })]
     
    4673                this.useBoolClock = (bool)value;
    4774                OnPropertyChanged("UseBoolClock");
     75                HasChanges = true;
     76            }
     77        }
     78
     79        private bool alwaysCreateOutput = false;
     80        [ContextMenu("Always create output", "With this checkbox enabled, an output will be generated, even though the clock is set to false. The output bit will be the bit from the last clock cycle.", 0, DisplayLevel.Experienced, ContextMenuControlType.CheckBox, null, new string[] { "Always generate output?" })]
     81        [TaskPane("Always create output", "With this checkbox enabled, an output will be generated, even though the clock is set to false. The output bit will be the bit from the last clock cycle.", null, 1, false, DisplayLevel.Beginner, ControlType.CheckBox, "", null)]
     82        public bool AlwaysCreateOutput
     83        {
     84            get { return this.alwaysCreateOutput; }
     85            set
     86            {
     87                this.alwaysCreateOutput = (bool)value;
     88                OnPropertyChanged("AlwaysCreateOutput");
    4889                HasChanges = true;
    4990            }
Note: See TracChangeset for help on using the changeset viewer.