Ejemplo n.º 1
0
        public static string Decrypt(string settingsFileName, string digraphFileName, string message)
        {
            MonthlySettings _monthlySettings = null;

            FileInfo fi = new FileInfo(settingsFileName);

            if (fi.Exists)
            {
                if (fi.Extension.ToLower() == ".xml")
                {
                    _monthlySettings = MonthlySettings.Open(settingsFileName);
                }
                else
                {
                    string fileContent = fi.OpenText().ReadToEnd();
                    _monthlySettings = MonthlySettings.Parse(fileContent);
                }
            }

            string[]        lines   = BreakMessageIntoGroups(message);
            string[]        headers = GetHeaders(lines);
            List <string[]> parts   = GetParts(headers, lines);

            string[,] digraphs = Utility.ParseDigraphTable(digraphFileName);

            List <string> decrypts = new List <string>();

            for (int i = 0; i < headers.Length; i++)
            {
                decrypts.Add(DecryptPart(headers[i], _monthlySettings, parts[i], digraphs));
            }

            return(string.Concat(decrypts));
        }
Ejemplo n.º 2
0
        public void TestNavyMessagingM3()
        {
            string fileName        = IoUtil.MonthFileName(DateTime.Now.Year, DateTime.Now.Month, ".xml");
            string digraphFileName = IoUtil.DigraphFileName(DateTime.Now.Year, DateTime.Now.Month);

            string folder = Path.GetTempPath();

            string xmlFullPath     = Path.Combine(folder, fileName);
            string digraphFullPath = Path.Combine(folder, digraphFileName);

            MonthlySettings monSet = MonthlySettings.Random(DateTime.Now.Year, DateTime.Now.Month, MachineType.M3K);

            monSet.Save(xmlFullPath);
            IoUtil.SaveDigraphTable(DateTime.Now.Year, DateTime.Now.Month, folder);

            NavyMessage msg = new NavyMessage(xmlFullPath, digraphFullPath, LONG_TEST_PLAIN_TEXT, DateTime.Now.Day, "XYZ");

            string messageText = msg.ToString();

            string decrypted  = NavyMessage.Decrypt(xmlFullPath, digraphFullPath, messageText);
            string cleanPlain = Utility.GetPaddedString(Utility.CleanString(LONG_TEST_PLAIN_TEXT), 4);

            Assert.AreEqual(decrypted, cleanPlain);

            File.Delete(xmlFullPath);
            File.Delete(digraphFullPath);
        }
Ejemplo n.º 3
0
        public static void SaveYear(string folder, string title, int year, MachineType t)
        {
            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            for (int m = 1; m <= 12; m++)
            {
                string monthFolderName = MonthFolderName(year, m);
                string monthFolderPath = Path.Combine(folder, monthFolderName);

                if (!Directory.Exists(monthFolderPath))
                {
                    Directory.CreateDirectory(monthFolderPath);
                }

                MonthlySettings s = MonthlySettings.Random(year, m, t);
                string          serializedFileName = MonthFileName(year, m, ".xml");

                string serializedPath = Path.Combine(monthFolderPath, serializedFileName);
                s.Save(serializedPath);

                string textFileName = MonthFileName(year, m, ".txt");
                string textFilePath = Path.Combine(monthFolderPath, textFileName);
                SaveFile(textFilePath, Formatting.MonthlySettings(title, year, m, t, s.DailySettings));

                SaveDigraphTable(year, m, monthFolderPath);
            }

            SaveKeySheet(year, folder);
        }
Ejemplo n.º 4
0
        public void MonthlySettingsHaveCorrectNumberOfDays()
        {
            int             days = DateTime.DaysInMonth(2015, 12);
            MonthlySettings ms   = MonthlySettings.Random(2015, 12, MachineType.M4K, ReflectorType.B_Dunn);

            Assert.AreEqual(ms.DailySettings.Count, days);
        }
Ejemplo n.º 5
0
        public void CheckMonthlySettingsCloneMethod()
        {
            MonthlySettings monset = MonthlySettings.Random(2000, 1, MachineType.M3);
            var             check  = monset.Clone() as MonthlySettings;

            Assert.IsTrue(check != null && check == monset);
        }
Ejemplo n.º 6
0
        private static string DecryptPart(string header, MonthlySettings monSet, string[] groups, string[,] digraphs)
        {
            string[] headerTokens    = header.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
            string[] timestampTokens = headerTokens[1].Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);

            int day = int.Parse(timestampTokens[1]);

            Settings settings = monSet.DailySettings.FirstOrDefault(s => s.Day == day);

            string indicator1 = groups[0];
            string indicator2 = groups[1];

            string cipherText = string.Concat(groups.Skip(2).Take(groups.Length - 4));
            string messageKey, startPosition;

            DecryptDigraphs(indicator1, indicator2, digraphs, out startPosition, out messageKey);

            if (settings.Grund.Length == 3)
            {
                string trimmedStart = startPosition.Substring(1, 3);
                string trimmedKey   = messageKey.Substring(0, 3);

                Enigma.Message msg         = new Enigma.Message(settings);
                string         actualStart = msg.Encrypt(trimmedKey, trimmedStart);

                return(msg.Decrypt(cipherText, actualStart));
            }
            else
            {
                Enigma.Message msg         = new Enigma.Message(settings);
                string         actualStart = msg.Encrypt(messageKey, startPosition);

                return(msg.Decrypt(cipherText, actualStart));
            }
        }
Ejemplo n.º 7
0
        public static string Title(MonthlySettings s)
        {
            string left   = string.Format("{0} CRYPTO", s.Classification.ToUpper());
            string center = string.Format("{0} {1} {2}", s.Name.ToUpper(), s.Indicator, s.NumericIndicator);
            string right  = string.Format("{0:MMM yyyy}", s.Date).ToUpper();

            int leftSpaces  = (LINE.Length - left.Length - center.Length - right.Length) / 2;
            int rightSpaces = LINE.Length - leftSpaces - left.Length - center.Length - right.Length;

            return(string.Format("{0}{1}{2}{3}{4}", left, new string(' ', leftSpaces), center, new string(' ', rightSpaces), right));
        }
Ejemplo n.º 8
0
        private static MonthlySettings GetMonthlySettings(SqlDataReader rdr)
        {
            MonthlySettings result = new MonthlySettings();

            result.Id               = rdr.GetInt32(rdr.GetOrdinal("Id"));
            result.Classification   = rdr.GetString(rdr.GetOrdinal("Classification"));
            result.Date             = rdr.GetDateTime(rdr.GetOrdinal("Date"));
            result.Indicator        = rdr.GetString(rdr.GetOrdinal("Indicator"));
            result.Name             = rdr.GetString(rdr.GetOrdinal("Name"));
            result.NumericIndicator = rdr.GetString(rdr.GetOrdinal("NumericIndicator"));
            result.ParentId         = rdr.GetInt32(rdr.GetOrdinal("YearlySettingId"));

            return(result);
        }
Ejemplo n.º 9
0
        public void CheckMonthlySettingParsingAndEquality()
        {
            MonthlySettings monSet = MonthlySettings.Random(2000, 1, MachineType.M3);
            MonthlySettings check  = MonthlySettings.Parse(monSet.ToString());

            Assert.IsTrue(monSet == check);

            monSet = MonthlySettings.Random(2000, 1, MachineType.M3K);
            check  = MonthlySettings.Parse(monSet.ToString());
            Assert.IsTrue(monSet == check);

            monSet = MonthlySettings.Random(2000, 1, MachineType.M4K);
            check  = MonthlySettings.Parse(monSet.ToString());
            Assert.IsTrue(monSet == check);
        }
Ejemplo n.º 10
0
        private static void SaveMonthlyFiles(MonthlySettings settings, string folder)
        {
            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            string xmlPath = Path.Combine(folder, MonthlySettingFileName(settings, ".xml"));

            settings.Save(xmlPath);

            string txtPath = Path.Combine(folder, MonthlySettingFileName(settings, ".txt"));

            SaveFile(settings.ToString(), txtPath);
        }
Ejemplo n.º 11
0
        private static string InsertMonthlySettingsSql(MonthlySettings ms, out SqlParameter[] parameters)
        {
            StringBuilder sb = new StringBuilder();

            List <SqlParameter> p = new List <SqlParameter>();

            sb.AppendLine("INSERT INTO [dbo].[MonthlySetting]");
            sb.AppendLine("           ([Name]");
            sb.AppendLine("           ,[Classification]");
            sb.AppendLine("           ,[Date]");
            sb.AppendLine("           ,[Indicator]");
            sb.AppendLine("           ,[YearlySettingId]");
            sb.AppendLine("           ,[NumericIndicator])");
            sb.AppendLine("     VALUES");
            sb.AppendLine("           (@Name");
            sb.AppendLine("           ,@Classification");
            sb.AppendLine("           ,@Date");
            sb.AppendLine("           ,@Indicator");
            sb.AppendLine("           ,@YearlySettingId");
            sb.AppendLine("           ,@NumericIndicator);");
            sb.AppendLine("SELECT @Id = SCOPE_IDENTITY()");

            p.Add(new SqlParameter {
                ParameterName = "@Id", DbType = System.Data.DbType.Int32, Direction = System.Data.ParameterDirection.Output
            });
            p.Add(new SqlParameter {
                ParameterName = "@Name", DbType = System.Data.DbType.String, Direction = System.Data.ParameterDirection.Input, Size = 255, Value = ms.Name
            });
            p.Add(new SqlParameter {
                ParameterName = "@Classification", DbType = System.Data.DbType.String, Direction = System.Data.ParameterDirection.Input, Size = 255, Value = ms.Classification
            });
            p.Add(new SqlParameter {
                ParameterName = "@Date", DbType = System.Data.DbType.DateTime, Direction = System.Data.ParameterDirection.Input, Value = ms.Date
            });
            p.Add(new SqlParameter {
                ParameterName = "@Indicator", DbType = System.Data.DbType.String, Direction = System.Data.ParameterDirection.Input, Size = 5, Value = ms.Indicator
            });
            p.Add(new SqlParameter {
                ParameterName = "@YearlySettingId", DbType = System.Data.DbType.Int32, Direction = System.Data.ParameterDirection.Input, Value = ms.ParentId
            });
            p.Add(new SqlParameter {
                ParameterName = "@NumericIndicator", DbType = System.Data.DbType.String, Direction = System.Data.ParameterDirection.Input, Size = 5, Value = ms.NumericIndicator
            });

            parameters = p.ToArray();

            return(sb.ToString());
        }
Ejemplo n.º 12
0
        public static void SaveYearlyFiles(string name, string classification, int year, string folder)
        {
            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            for (int m = 1; m <= 12; m++)
            {
                DateTime        dt              = new DateTime(year, m, 1);
                string          folderName      = string.Format("{0} {1:MMM yyyy}", name, dt);
                string          monthFolderName = Path.Combine(folder, folderName);
                MonthlySettings monSet          = MonthlySettings.Random(name, classification, dt);
                SaveMonthlyFiles(monSet, monthFolderName);
            }
        }
Ejemplo n.º 13
0
        public void WhenSavingSettingsTheSchemaFileIsAlsoSaved()
        {
            string folderName = Path.GetTempPath();
            string fileName   = Path.GetTempFileName();

            MonthlySettings ms = MonthlySettings.Random(2015, 12, MachineType.M4K, ReflectorType.B_Dunn, false);

            string filePath = Path.Combine(folderName, fileName);

            ms.Save(filePath);

            Assert.AreEqual(true, File.Exists(Path.Combine(folderName, "Settings.xsd")));

            File.Delete(filePath);
            File.Delete(Path.Combine(folderName, "Settings.xsd"));
        }
Ejemplo n.º 14
0
        public void MonthlySettingsSerializationAndSave()
        {
            string folderName = Path.GetTempPath();
            string fileName   = Path.GetTempFileName();

            MonthlySettings ms = MonthlySettings.Random(2015, 12, MachineType.M4K, ReflectorType.B_Dunn, false);

            string filePath = Path.Combine(folderName, fileName);

            ms.Save(filePath);
            string foo = ms.ToString();

            ms = MonthlySettings.Open(filePath);
            Assert.AreEqual(ms.ToString(), foo);

            File.Delete(filePath);
        }
Ejemplo n.º 15
0
        public NavyMessage(string settingsFileName, string digraphFileName, string input, int day, string callSign)
        {
            MonthlySettingsFileName = settingsFileName;
            PlainText = input;
            Day       = day;

            List <NavyMessagePart> _innerParts = new List <NavyMessagePart>();

            FileInfo fi = new FileInfo(MonthlySettingsFileName);

            if (fi.Exists)
            {
                if (fi.Extension.ToLower() == ".xml")
                {
                    _monthlySettings = MonthlySettings.Open(MonthlySettingsFileName);
                }
                else
                {
                    using (StreamReader rdr = fi.OpenText())
                    {
                        string fileContent = rdr.ReadToEnd();
                        _monthlySettings = MonthlySettings.Parse(fileContent);
                    }
                }
            }

            string cleanInput  = Utility.CleanString(input);
            string paddedInput = Utility.GetPaddedString(cleanInput, 4);

            string[] parts = Utility.GetMessageParts(paddedInput, 4, 96);
            string[,] digs = Utility.ParseDigraphTable(digraphFileName);

            Settings s = _monthlySettings.DailySettings.FirstOrDefault(ss => ss.Day == Day);

            if (s == null)
            {
                s = _monthlySettings.DailySettings.Last();
            }

            for (int i = 0; i < parts.Length; i++)
            {
                _innerParts.Add(new NavyMessagePart(s, callSign, parts[i], i, parts.Length, digs));
            }

            Parts = _innerParts;
        }
Ejemplo n.º 16
0
        private static Settings GetSettingsByKenngruppen(MonthlySettings monSet, string kg)
        {
            string fh = kg.Substring(0, 3);
            string lh = kg.Substring(2, 3);

            foreach (var s in monSet.DailySettings)
            {
                foreach (var k in s.Kenngruppen)
                {
                    if (k == fh || k == lh)
                    {
                        return(s);
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 17
0
        public ArmyMessage(string settingsFileName, string input, int day)
        {
            MonthlySettingsFileName = settingsFileName;
            PlainText = input;
            Day       = day;

            List <ArmyMessagePart> _innerParts = new List <ArmyMessagePart>();

            FileInfo fi = new FileInfo(MonthlySettingsFileName);

            if (fi.Exists)
            {
                if (fi.Extension.ToLower() == ".xml")
                {
                    _monthlySettings = MonthlySettings.Open(MonthlySettingsFileName);
                }
                else
                {
                    string fileContent = fi.OpenText().ReadToEnd();
                    _monthlySettings = MonthlySettings.Parse(fileContent);
                }
            }

            string cleanInput  = Utility.CleanString(input);
            string paddedInput = Utility.GetPaddedString(cleanInput, 5);

            string[] parts = Utility.GetMessageParts(paddedInput, 5, 49);

            Settings s = _monthlySettings.DailySettings.FirstOrDefault(ss => ss.Day == Day);

            if (s == null)
            {
                s = _monthlySettings.DailySettings.Last();
            }

            for (int i = 0; i < parts.Length; i++)
            {
                _innerParts.Add(new ArmyMessagePart(s, parts[i], i, parts.Length));
            }

            Parts = _innerParts;
        }
Ejemplo n.º 18
0
        private static string DecryptPart(string header, string[] groups, MonthlySettings settings)
        {
            string[] headerTokens = header.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);

            string last = headerTokens.Last().Trim();

            string[] messageRotorSettings = last.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

            string rotorPos  = messageRotorSettings[0];
            string indicator = messageRotorSettings[1];

            Settings partSettings = GetSettingsByKenngruppen(settings, groups[0]);

            Enigma.Message msg    = new Enigma.Message(partSettings);
            string         msgKey = msg.Encrypt(indicator, rotorPos);

            string partBody = string.Concat(groups.Skip(1).Take(groups.Length - 1));

            return(msg.Decrypt(partBody, msgKey));
        }
Ejemplo n.º 19
0
        public void MonthlySettingsSaveValidXmlWhenSerializing()
        {
            string folderName = Path.GetTempPath();
            string fileName   = Path.GetTempFileName();

            MonthlySettings ms = MonthlySettings.Random(2015, 12, MachineType.M4K, ReflectorType.B_Dunn, false);

            string filePath = Path.Combine(folderName, fileName);

            ms.Save(filePath);

            XmlDocument doc = new XmlDocument();

            doc.Load(filePath);

            doc.Schemas.Add("", Path.Combine(folderName, "Settings.xsd"));
            doc.Validate(XmlValidationHandler);

            Assert.AreEqual(xmlValidationCount, 0);

            File.Delete(filePath);
            File.Delete(Path.Combine(folderName, "Settings.xsd"));
        }
Ejemplo n.º 20
0
        public static string FormatMonthlySettings(MonthlySettings ms)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine();
            sb.AppendLine(Title(ms));
            sb.AppendLine();
            sb.AppendLine();

            sb.AppendLine(LINE);
            sb.AppendLine(HEADING_ONE);
            sb.AppendLine(HEADING_TWO);
            sb.AppendLine(LINE);

            foreach (Settings s in ms.DailySettings)
            {
                sb.AppendLine(SettingLineOne(s));
                sb.AppendLine(SettingLineTwo(s));
                sb.AppendLine(LINE);
            }

            return(sb.ToString().Trim());
        }
Ejemplo n.º 21
0
        public static void SaveMonth(string folder, string title, int year, int month, MachineType t)
        {
            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            MonthlySettings s = MonthlySettings.Random(year, month, t);

            string fileName = MonthFileName(year, month, TEXT_FILE_EXTENSION);
            string filePath = Path.Combine(folder, fileName);

            SaveFile(filePath, Formatting.MonthlySettings(title, year, month, t, s.DailySettings));

            fileName = MonthFileName(year, month, XML_FILE_EXTENSION);
            filePath = Path.Combine(folder, fileName);
            s.Save(filePath);

            if (t != MachineType.M3)
            {
                SaveDigraphTable(year, month, folder);
            }
        }
Ejemplo n.º 22
0
        public static MonthlySettings ParseSettings(string settings)
        {
            string[] lines = settings.Split(new string[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);

            string titleLine = lines[0];

            string[] titleTokens = titleLine.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

            string[] days = lines.Skip(4).Take(lines.Length - 5).ToArray();

            MonthlySettings result = new MonthlySettings();

            result.Title = titleTokens[1];
            result.Month = ParseMonth(titleTokens[2]);
            result.Year  = int.Parse(titleTokens[3]);

            foreach (string s in days)
            {
                result.DailySettings.Add(Settings.ParseSettingLine(s));
            }

            return(result);
        }
Ejemplo n.º 23
0
 private static string MonthlySettingFileName(MonthlySettings monSet, string ext)
 {
     return(string.Format("Settings_{0}_{1:MMMyyyy}{2}", monSet.Name, monSet.Date, ext));
 }
Ejemplo n.º 24
0
        private static List <YearlySettings> GetYearlySettingsFromDb(SqlDataReader rdr)
        {
            List <YearlySettings> results = new List <YearlySettings>();

            if (rdr.Read())
            {
                YearlySettings result = GetYearlySettings(rdr);

                Dictionary <int, MonthlySettings> monthLookup  = new Dictionary <int, MonthlySettings>();
                Dictionary <int, Settings>        dayLookup    = new Dictionary <int, Settings>();
                Dictionary <int, Wiring>          wiringLookup = new Dictionary <int, Wiring>();

                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        MonthlySettings monSet = GetMonthlySettings(rdr);
                        monSet.ParentSettings = result;
                        result.MonthlySettings.Add(monSet);
                        monthLookup.Add(monSet.Id, monSet);
                    }
                }
                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        Settings daySet = GetDailySettings(rdr);
                        daySet.ParentSettings = monthLookup[daySet.ParentId];
                        monthLookup[daySet.ParentId].DailySettings.Add(daySet);
                        dayLookup.Add(daySet.Id, daySet);
                    }
                }
                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        RotorSetting rotSet = GetRotorSetting(rdr);
                        rotSet.ParentSettings = dayLookup[rotSet.ParentId];
                        dayLookup[rotSet.ParentId].Rotors.Add(rotSet);
                    }
                }
                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        Wiring wir = GetWiring(rdr);
                        wir.ParentSettings = monthLookup[wir.ParentId];
                        monthLookup[wir.ParentId].Wiring = wir;
                        wiringLookup.Add(wir.Id, wir);
                    }
                }
                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        GetRotor(wiringLookup, rdr);
                    }
                }
                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        GetNotch(wiringLookup, rdr);
                    }
                }
                if (rdr.NextResult())
                {
                    while (rdr.Read())
                    {
                        GetMove(wiringLookup, rdr);
                    }
                }

                results.Add(result);
            }
            return(results);
        }
Ejemplo n.º 25
0
        public void MonthlyRotorSettingsInCompatibilityMode()
        {
            MonthlySettings ms = MonthlySettings.Random(2015, 12, MachineType.M4K, ReflectorType.B_Dunn, true);

            Assert.AreEqual(true, ms.DailySettings.All(s => s.Rotors[0].Name == RotorName.Beta && s.Rotors[0].RingSetting == 0));
        }