using KFDtool.P25.Constant; using KFDtool.P25.Generator; using KFDtool.P25.TransferConstructs; using KFDtool.P25.Validator; using KFDtool.Shared; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace KFDtool.Gui.Control { /// /// Interaction logic for P25Keyload.xaml /// public partial class P25Keyload : UserControl { private bool IsKek { get; set; } public P25Keyload() { InitializeComponent(); IsKek = false; cbActiveKeyset.IsChecked = true; // check here to trigger the cb/txt logic on load cboType.SelectedIndex = 0; // set to the first item here to trigger the cbo/lbl logic on load cboAlgo.SelectedIndex = 0; // set to the first item here to trigger the cbo/txt logic on load cbHide.IsChecked = true; // check here to trigger the cb/txt logic on load } private void KeysetIdDec_TextChanged(object sender, TextChangedEventArgs e) { if (txtKeysetIdDec.IsFocused) { int num; if (int.TryParse(txtKeysetIdDec.Text, out num)) { txtKeysetIdHex.Text = string.Format("{0:X}", num); } else { txtKeysetIdHex.Text = string.Empty; } } } private void KeysetIdHex_TextChanged(object sender, TextChangedEventArgs e) { if (txtKeysetIdHex.IsFocused) { int num; if (int.TryParse(txtKeysetIdHex.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out num)) { txtKeysetIdDec.Text = num.ToString(); } else { txtKeysetIdDec.Text = string.Empty; } } } private void OnActiveKeysetChecked(object sender, RoutedEventArgs e) { txtKeysetIdDec.Text = string.Empty; txtKeysetIdHex.Text = string.Empty; txtKeysetIdDec.IsEnabled = false; txtKeysetIdHex.IsEnabled = false; } private void OnActiveKeysetUnchecked(object sender, RoutedEventArgs e) { txtKeysetIdDec.IsEnabled = true; txtKeysetIdHex.IsEnabled = true; } private void SlnDec_TextChanged(object sender, TextChangedEventArgs e) { if (txtSlnDec.IsFocused) { int num; if (int.TryParse(txtSlnDec.Text, out num)) { txtSlnHex.Text = string.Format("{0:X}", num); } else { txtSlnHex.Text = string.Empty; } UpdateType(); } } private void SlnHex_TextChanged(object sender, TextChangedEventArgs e) { if (txtSlnHex.IsFocused) { int num; if (int.TryParse(txtSlnHex.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out num)) { txtSlnDec.Text = num.ToString(); } else { txtSlnDec.Text = string.Empty; } UpdateType(); } } private void UpdateType() { if (cboType.SelectedItem != null) { string name = ((ComboBoxItem)cboType.SelectedItem).Name as string; if (name == "AUTO") { int num; if (int.TryParse(txtSlnHex.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out num)) { if (num >= 0 && num <= 61439) { lblType.Content = "TEK"; IsKek = false; } else if (num >= 61440 && num <= 65535) { lblType.Content = "KEK"; IsKek = true; } else { lblType.Content = "Auto"; } } else { lblType.Content = "Auto"; } } else if (name == "TEK") { lblType.Content = "TEK"; IsKek = false; } else if (name == "KEK") { lblType.Content = "KEK"; IsKek = true; } else { // error } } } private void OnTypeChanged(object sender, SelectionChangedEventArgs e) { UpdateType(); } private void KeyIdDec_TextChanged(object sender, TextChangedEventArgs e) { if (txtKeyIdDec.IsFocused) { int num; if (int.TryParse(txtKeyIdDec.Text, out num)) { txtKeyIdHex.Text = string.Format("{0:X}", num); } else { txtKeyIdHex.Text = string.Empty; } } } private void KeyIdHex_TextChanged(object sender, TextChangedEventArgs e) { if (txtKeyIdHex.IsFocused) { int num; if (int.TryParse(txtKeyIdHex.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out num)) { txtKeyIdDec.Text = num.ToString(); } else { txtKeyIdDec.Text = string.Empty; } } } private void AlgoDec_TextChanged(object sender, TextChangedEventArgs e) { if (txtAlgoDec.IsFocused) { int num; if (int.TryParse(txtAlgoDec.Text, out num)) { txtAlgoHex.Text = string.Format("{0:X}", num); } else { txtAlgoHex.Text = string.Empty; } } } private void AlgoHex_TextChanged(object sender, TextChangedEventArgs e) { if (txtAlgoHex.IsFocused) { UpdateAlgoHexToDec(); } } private void UpdateAlgoHexToDec() { int num; if (int.TryParse(txtAlgoHex.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out num)) { txtAlgoDec.Text = num.ToString(); } else { txtAlgoDec.Text = string.Empty; } } private void OnAlgoChanged(object sender, SelectionChangedEventArgs e) { if (cboAlgo.SelectedItem != null) { string name = ((ComboBoxItem)cboAlgo.SelectedItem).Name as string; if (name == "AES256") { txtAlgoHex.Text = "84"; UpdateAlgoHexToDec(); txtAlgoDec.IsEnabled = false; txtAlgoHex.IsEnabled = false; } else if (name == "DESOFB") { txtAlgoHex.Text = "81"; UpdateAlgoHexToDec(); txtAlgoDec.IsEnabled = false; txtAlgoHex.IsEnabled = false; } else if (name == "DESXL") { txtAlgoHex.Text = "9F"; UpdateAlgoHexToDec(); txtAlgoDec.IsEnabled = false; txtAlgoHex.IsEnabled = false; } else if (name == "ADP") { txtAlgoHex.Text = "AA"; UpdateAlgoHexToDec(); txtAlgoDec.IsEnabled = false; txtAlgoHex.IsEnabled = false; } else { txtAlgoDec.Text = string.Empty; txtAlgoHex.Text = string.Empty; txtAlgoDec.IsEnabled = true; txtAlgoHex.IsEnabled = true; } } } private void Generate_Button_Click(object sender, RoutedEventArgs e) { int algId = 0; try { algId = Convert.ToInt32(txtAlgoHex.Text, 16); } catch (Exception) { MessageBox.Show("Error Parsing Algorithm ID", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } if (!FieldValidator.IsValidAlgorithmId(algId)) { MessageBox.Show("Algorithm ID invalid - valid range 0 to 255 (dec), 0x00 to 0xFF (hex)", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } List key = new List(); if (algId == (byte)AlgorithmId.AES256) { key = KeyGenerator.GenerateVarKey(32); } else if (algId == (byte)AlgorithmId.DESOFB || algId == (byte)AlgorithmId.DESXL) { key = KeyGenerator.GenerateSingleDesKey(); } else if (algId == (byte)AlgorithmId.ADP) { key = KeyGenerator.GenerateVarKey(5); } else { MessageBox.Show(string.Format("No key generator exists for algorithm ID 0x{0:X2}", algId), "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } SetKey(BitConverter.ToString(key.ToArray()).Replace("-", string.Empty)); } private void OnHideChecked(object sender, RoutedEventArgs e) { txtKeyHidden.Password = txtKeyVisible.Text; txtKeyVisible.Text = string.Empty; txtKeyVisible.Visibility = Visibility.Hidden; txtKeyHidden.Visibility = Visibility.Visible; } private void OnHideUnchecked(object sender, RoutedEventArgs e) { txtKeyVisible.Text = txtKeyHidden.Password; txtKeyHidden.Password = null; txtKeyVisible.Visibility = Visibility.Visible; txtKeyHidden.Visibility = Visibility.Hidden; } private string GetKey() { if (cbHide.IsChecked == true) { return txtKeyHidden.Password; } else { return txtKeyVisible.Text; } } private void SetKey(string str) { if (cbHide.IsChecked == true) { txtKeyHidden.Password = str; } else { txtKeyVisible.Text = str; } } private void Load_Button_Click(object sender, RoutedEventArgs e) { int keysetId = 0; int sln = 0; int keyId = 0; int algId = 0; List key = new List(); bool useActiveKeyset = cbActiveKeyset.IsChecked == true; if (useActiveKeyset) { keysetId = 2; // to pass validation, will not get used } else { try { keysetId = Convert.ToInt32(txtKeysetIdHex.Text, 16); } catch (Exception) { MessageBox.Show("Error Parsing Keyset ID", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } } try { sln = Convert.ToInt32(txtSlnHex.Text, 16); } catch (Exception) { MessageBox.Show("Error Parsing SLN", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } try { keyId = Convert.ToInt32(txtKeyIdHex.Text, 16); } catch (Exception) { MessageBox.Show("Error Parsing Key ID", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } try { algId = Convert.ToInt32(txtAlgoHex.Text, 16); } catch (Exception) { MessageBox.Show("Error Parsing Algorithm ID", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } try { key = Utility.ByteStringToByteList(GetKey()); } catch (Exception) { MessageBox.Show("Error Parsing Key", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } Tuple validateResult = FieldValidator.KeyloadValidate(keysetId, sln, IsKek, keyId, algId, key); if (validateResult.Item1 == ValidateResult.Warning) { if (MessageBox.Show(string.Format("{1}{0}{0}Continue?", Environment.NewLine, validateResult.Item2), "Warning", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No) { return; } } else if (validateResult.Item1 == ValidateResult.Error) { MessageBox.Show(validateResult.Item2, "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } List keys = new List(); CmdKeyItem keyItem = new CmdKeyItem(); keyItem.UseActiveKeyset = useActiveKeyset; keyItem.KeysetId = keysetId; keyItem.Sln = sln; keyItem.IsKek = IsKek; keyItem.KeyId = keyId; keyItem.AlgorithmId = algId; keyItem.Key = key; keys.Add(keyItem); try { Interact.Keyload(Settings.Port, keys); } catch (Exception ex) { MessageBox.Show(string.Format("Error -- {0}", ex.Message), "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } MessageBox.Show("Key Loaded Successfully", "Information", MessageBoxButton.OK, MessageBoxImage.Information); } } }