Changeset 288 for trunk/CrypPlugins/LFSR


Ignore:
Timestamp:
Apr 15, 2009, 8:41:06 PM (13 years ago)
Author:
Sören Rinne
Message:
  • modified CLK so that it starts right at the beginning
  • LFSR now reads polynomials and binary sequences as TapSequence input
  • LFSR runs only one round if binary clock is used
  • cleaned code of XORBinary
Location:
trunk/CrypPlugins/LFSR
Files:
2 edited

Legend:

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

    r286 r288  
    1212using Cryptool.PluginBase.Miscellaneous;
    1313using System.Security.Cryptography;
     14// for [MethodImpl(MethodImplOptions.Synchronized)]
    1415using System.Runtime.CompilerServices;
    1516using System.Runtime.Remoting.Contexts;
     
    1819using System.Threading;
    1920using System.Windows.Automation.Peers;
    20 // /for QuickwatchPresentation
     21// for RegEx
     22using System.Text.RegularExpressions;
    2123
    2224namespace Cryptool.LFSR
     
    202204            if ((inputTapSequence == null || (inputTapSequence != null && inputTapSequence.Length == 0)))
    203205            {
    204                 //create some input
     206                // create some input
    205207                String dummystring = "1011";
    206 //                this.inputTapSequence = new String();
     208                // this.inputTapSequence = new String();
    207209                inputTapSequence = dummystring;
    208210                // write a warning to the outside world
    209                 GuiLogMessage("WARNING - No TapSequence provided. Using dummy data. (" + dummystring + ")", NotificationLevel.Warning);
     211                GuiLogMessage("WARNING - No TapSequence provided. Using dummy data (" + dummystring + ").", NotificationLevel.Warning);
    210212            }
    211213        }
     
    215217            if ((inputSeed == null || (inputSeed != null && inputSeed.Length == 0)))
    216218            {
    217                 //create some input
     219                // create some input
    218220                String dummystring = "1010";
    219                 //this.inputSeed = new CryptoolStream();
     221                // this.inputSeed = new CryptoolStream();
    220222                inputSeed = dummystring;
    221223                // write a warning to the outside world
    222                 GuiLogMessage("WARNING - No Seed provided. Using dummy data. (" + dummystring + ")", NotificationLevel.Warning);
     224                GuiLogMessage("WARNING - No Seed provided. Using dummy data (" + dummystring + ").", NotificationLevel.Warning);
    223225            }
    224226        }
     
    233235                this.inputClock.OpenRead(this.GetPluginInfoAttribute().Caption, Encoding.Default.GetBytes(dummystring.ToCharArray()));
    234236                // write a warning to the outside world
    235                 GuiLogMessage("FYI - No clock provided. Asuming always 1.", NotificationLevel.Info);
    236             }
    237         }
    238 
    239         private bool checkForClockEvent()
    240         {
    241             // checks if current event is a clock event
    242             //PropertyChangingEventArgs.??
    243             return true;
     237                GuiLogMessage("FYI - No clock input provided. Assuming number of rounds specified in LFSR settings.", NotificationLevel.Info);
     238            }
     239        }
     240
     241        // Function to make binary representation of polynomial
     242        private String MakeBinary(String strPoly)
     243        {
     244            bool gotX = false;
     245            // remove spaces
     246            strPoly = strPoly.Replace(" ", "");
     247
     248            Regex gotXRegEx = new Regex("(\\+x\\+1)+$");
     249            if (gotXRegEx.IsMatch(strPoly)) gotX = true;
     250            // remove last '1'
     251            strPoly = strPoly.Remove(strPoly.Length - 1, 1);
     252            // remove all x
     253            strPoly = strPoly.Replace("x", "");
     254            // remove all ^
     255            strPoly = strPoly.Replace("^", "");
     256
     257            // split in string array
     258            string[] strPolySplit = strPoly.Split(new string[] { "+" }, StringSplitOptions.RemoveEmptyEntries);
     259            // convert to integer
     260            int[] intPolyInteger = new int[strPolySplit.Length];
     261            for (int i = strPolySplit.Length - 1; i >= 0; i--)
     262            {
     263                intPolyInteger[i] = Convert.ToInt32(strPolySplit[i]);
     264            }
     265
     266            string strPolyBinary = null;
     267            if (strPoly.Length != 0)
     268            {
     269                Array.Sort(intPolyInteger);
     270                int highestOne = intPolyInteger[intPolyInteger.Length - 1];
     271
     272                int j = intPolyInteger.Length - 1;
     273                for (int i = highestOne; i > 1; i--)
     274                {
     275                    if (j < 0 && (i != 1 || i != 0)) strPolyBinary += 0;
     276                    else if (intPolyInteger[j] == i)
     277                    {
     278                        strPolyBinary += 1;
     279                        j--;
     280                    }
     281                    else strPolyBinary += 0;
     282                }
     283            }
     284            if (gotX) strPolyBinary += 1;
     285            else strPolyBinary += 0;
     286            strPolyBinary += 1;
     287
     288            return strPolyBinary;
     289        }
     290
     291        // Function to test for LFSR Polnyomial
     292        private bool IsPolynomial(String strPoly)
     293        {
     294            // delete spaces
     295            strPoly = strPoly.Replace(" ", "");
     296            //(x\^([2-9]|[0-9][0-9])\+)*[x]?([\+]?1){1}
     297            Regex objPolynomial = new Regex("(x\\^([2-9]|[0-9][0-9])\\+)+[x]?([\\+]?1){1}");
     298            Regex keinHoch0oder1 = new Regex("(x\\^[0-1]\\+)+");
     299            return !keinHoch0oder1.IsMatch(strPoly) && objPolynomial.IsMatch(strPoly);
    244300        }
    245301
     
    256312            try
    257313            {
    258                 //if (!checkForClockEvent()) return;
    259314                checkForInputTapSequence();
    260315                checkForInputSeed();
     
    274329                }
    275330
    276                 if (inputTapSequence.Length != inputSeed.Length)
     331                // read tapSequence
     332                tapSequencebuffer = inputTapSequence;
     333
     334                // convert tapSequence into char array
     335                char[] tapSequenceCharArray = tapSequencebuffer.ToCharArray();
     336               
     337                // check if tapSequence is binary
     338                bool tapSeqisBool = true;
     339                foreach (char character in tapSequenceCharArray)
     340                {
     341                    if (character != '0' && character != '1')
     342                    {
     343                        tapSeqisBool = false;
     344                        //return;
     345                    }
     346                }
     347
     348                // if tapSequence is not binary, await polynomial
     349                if (!tapSeqisBool)
     350                {
     351                    GuiLogMessage("TapSequence is not binary. Awaiting polynomial.", NotificationLevel.Info);
     352                    if (IsPolynomial(tapSequencebuffer))
     353                    {
     354                        GuiLogMessage(tapSequencebuffer + " is a valid polynomial.", NotificationLevel.Info);
     355                        tapSequencebuffer = MakeBinary(tapSequencebuffer);
     356                        GuiLogMessage("Polynomial in binary form: " + tapSequencebuffer, NotificationLevel.Info);
     357
     358                        // check if polynomial has false length
     359                        if (tapSequencebuffer.Length != inputSeed.Length) {
     360                            // check if its too long
     361                            if (inputSeed.Length - tapSequencebuffer.Length < 0)
     362                            {
     363                                GuiLogMessage("ERROR - Your polynomial " + tapSequencebuffer + " is TOO LONG (" + tapSequencebuffer.Length + " Bits) for your seed. Aborting now.", NotificationLevel.Error);
     364                                if (!settings.UseBoolClock) inputClock.Close();
     365                                return;
     366                            }
     367                            // seems to be too short, so fill it with zeros at the beginning
     368                            else
     369                            {
     370                                for (int j = inputSeed.Length - tapSequencebuffer.Length; j > 0; j--)
     371                                {
     372                                    tapSequencebuffer = "0" + tapSequencebuffer;
     373                                }
     374                            }
     375                        }
     376
     377                        GuiLogMessage("Polynomial after length fitting: " + tapSequencebuffer, NotificationLevel.Info);
     378                        tapSequenceCharArray = tapSequencebuffer.ToCharArray();
     379                    }
     380                    else
     381                    {
     382                        GuiLogMessage("ERROR - " + tapSequencebuffer + " is NOT a valid polynomial. Aborting now.", NotificationLevel.Error);
     383                        //Console.WriteLine("\n{0} is NOT a valid polynomial.", tapSequencebuffer);
     384                        if (!settings.UseBoolClock) inputClock.Close();
     385                        return;
     386                    }
     387                }
     388
     389                if (tapSequencebuffer.Length != inputSeed.Length)
    277390                {
    278391                    // stop, because seed and tapSequence must have same length
     
    294407                    newSeed = false;
    295408                }
    296                 //seedbuffer = inputSeed;
    297                
    298                 // read tapSequence
    299                 tapSequencebuffer = inputTapSequence;
    300 
    301                 // convert tapSequence into char array
    302                 char[] tapSequenceCharArray = tapSequencebuffer.ToCharArray();
    303409
    304410                //check if last tap is 1, otherwise stop
     
    307413                    GuiLogMessage("ERROR - Last tap of tapSequence must 1. Aborting now.", NotificationLevel.Error);
    308414                    return;
    309                 }
    310 
    311                 // check if tapSequence is binary
    312                 foreach (char character in tapSequenceCharArray)
    313                 {
    314                     if (character != '0' && character != '1')
    315                     {
    316                         GuiLogMessage("ERROR 0 - TapSequence has to be binary. Aborting now. Character is: " + character, NotificationLevel.Error);
    317                         return;
    318                     }
    319415                }
    320416
     
    360456
    361457                // check if Rounds are given
    362                 int defaultRounds = 1;
     458                int defaultRounds = 4;
    363459                int actualRounds;
    364460
    365                 // check if Rounds in settings are given
    366                 //if (settings.Rounds == 0) actualRounds = defaultRounds; else actualRounds = settings.Rounds;
    367                 actualRounds = defaultRounds;
     461                // check if Rounds in settings are given and use them only if no bool clock is selected
     462                if (!settings.UseBoolClock)
     463                {
     464                    if (settings.Rounds == 0) actualRounds = defaultRounds; else actualRounds = settings.Rounds;
     465                }
     466                else actualRounds = 1;
    368467               
    369468                // Here we go!
     
    388487                        if (seedCharArray[seedBits - 1] == '0') outputBool = false;
    389488                        else outputBool = true;
    390                         GuiLogMessage("OutputBool is: " + outputBool.ToString(), NotificationLevel.Info);
     489                        //GuiLogMessage("OutputBool is: " + outputBool.ToString(), NotificationLevel.Info);
    391490
    392491                        // write last bit to output buffer, stream and bool
  • trunk/CrypPlugins/LFSR/LFSRSettings.cs

    r286 r288  
    2222        private bool hasChanges = false;
    2323       
    24         /*private int rounds = 4; //how many bits will be generated
     24        private int rounds = 4; //how many bits will be generated
    2525        //[ContextMenu("Rounds", "How many bits shall be generated?", 1, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, new int[] { 10, 50, 100 }, "10 bits", "50 bits", "100 bits")]
    2626        //[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)]
     27        [TaskPane("Rounds", "How many bits shall be generated? Note: This only applies if no boolean clock is used.", null, 0, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, int.MaxValue)]
    2828        public int Rounds
    2929        {
     
    3434                HasChanges = true;
    3535            }
    36         }*/
     36        }
    3737
    3838        private bool useBoolClock = false;
Note: See TracChangeset for help on using the changeset viewer.