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)); }
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); }
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); }
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); }
public void CheckMonthlySettingsCloneMethod() { MonthlySettings monset = MonthlySettings.Random(2000, 1, MachineType.M3); var check = monset.Clone() as MonthlySettings; Assert.IsTrue(check != null && check == monset); }
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)); } }
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)); }
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); }
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); }
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); }
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()); }
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); } }
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")); }
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); }
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; }
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); }
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; }
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)); }
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")); }
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()); }
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); } }
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); }
private static string MonthlySettingFileName(MonthlySettings monSet, string ext) { return(string.Format("Settings_{0}_{1:MMMyyyy}{2}", monSet.Name, monSet.Date, ext)); }
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); }
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)); }