common/Ui/GenesisToolBox/frmPassword.cs
2026-04-23 17:50:07 +02:00

616 lines
25 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Xylem.Common.CommonCore.Configuration;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisPwd;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
namespace Xylem.Common.Ui.GenesisToolBox
{
/// <summary>
/// Password access and write to meter
/// </summary>
public partial class FrmPassword : Form
{
private GenesisMeter _currentGenesis;
private readonly MeterBatch _meterBatch = new MeterBatch();
private const String StrConnecting = "Connecting";
private const String StrNotConnected = "NOT CONNECTED";
private const String StrPartPcbConnected = "Connected to PCBID:";
/// <summary>
/// Password handling form
/// </summary>
public FrmPassword()
{
InitializeComponent();
tmrProgressPcb.Tick += TmrProgressPcb_Tick;
tmrProgressDb.Tick += TmrProgressDb_Tick;
Init();
}
private void btnGet_Click(Object sender, EventArgs e)
{
txtPcbID.BackColor = Color.White;
lblConnectDb.Text = StrNotConnected;
lblConnectDb.ForeColor = Color.Red;
if (txtPcbID.Text.Length > 7)
{
Int32 pcbid;
if (int.TryParse(txtPcbID.Text, out pcbid))
{
try
{
Task.Factory.StartNew((Action)(() =>
{
ViewProgressDb(true);
#pragma warning disable CS0618 // Type or member is obsolete
var passwordServiceUrl = ServiceUrls.GenesisGetPasswordServiceUrl();
#pragma warning restore CS0618 // Type or member is obsolete
var http = (HttpWebRequest)WebRequest.Create(passwordServiceUrl + txtPcbID.Text);
var response = (HttpWebResponse)http.GetResponse();
var responseStream = response.GetResponseStream();
if (responseStream == null)
{
return;
}
var sr = new StreamReader(responseStream);
var autoPassword = "";
var url = ServiceUrls.GenesisGetPasswordContainerServiceUrl();
//var http = (HttpWebRequest)WebRequest.Create($"{url}{_currentGenesis.PcbId}");
var http2 = (HttpWebRequest)WebRequest.Create($"{url}{pcbid}");
http2.Headers.Add("Cache-Control", "no-cache");
var a = new MeterPwdDb();
var response2 = (HttpWebResponse)http2.GetResponse();
var responseStream2 = response2.GetResponseStream();
if (responseStream == null)
{
throw new InvalidOperationException();
}
if (response.StatusCode != HttpStatusCode.OK)
{
}
Invoke(new Action(() =>
{
using (var sr2 = new StreamReader(responseStream2))
{
var responseJson2 = sr2.ReadToEnd();
a = JsonConvert.DeserializeObject<MeterPwdDb>(responseJson2);
autoPassword = Encoding.UTF8.GetString(a.ListOfPasswords[7]);
}
var responseJson = sr.ReadToEnd();
//TODO THW hide skeleton key if read from DB
//txtSkeletonKey.Text = responseJson.Trim('"');
txtSkeletonKey.Text = a.Skeleton;
txtLvl8.Text = autoPassword;
lblConnectDb.Text = @"Connected to PWD DB";
lblConnectDb.ForeColor = Color.Green;
////TODO TEST ONLY remove here _isReadyPasswordFile
_isReadyPasswordFile = true;
//btnWritePwdFile.Enabled = true;
////TODO remove until here
}));
})).ContinueWith(delegate { ViewProgressDb(false); });
}
catch (Exception)
{
txtPcbID.BackColor = Color.Red;
}
}
else
{
txtPcbID.BackColor = Color.Red;
}
}
}
private void btnSet_Click(Object sender, EventArgs e)
{
if (txtPcbID.Text.Length > 7)
{
Int32 pcbid;
if (int.TryParse(txtPcbID.Text, out pcbid))
{
#pragma warning disable CS0618 // Type or member is obsolete
var passwordSetServiceUrl = ServiceUrls.GenesisSetPasswordServiceUrl();
#pragma warning restore CS0618 // Type or member is obsolete
var http = (HttpWebRequest)WebRequest.Create(passwordSetServiceUrl + txtPcbID.Text
+ "&Password=" + txtSkeletonKey.Text);
var response = (HttpWebResponse)http.GetResponse();
var responseStream = response.GetResponseStream();
if (responseStream == null)
{
return;
}
var sr = new StreamReader(responseStream);
var responseJson = sr.ReadToEnd();
if (responseJson.ToLower().Contains("store"))
{
MessageBox.Show(@"Skeleton Key stored to data base");
}
else
{
MessageBox.Show(@"Not stored");
}
}
}
}
private void WriteValue<T>(String reg, T value)
{
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
{
return;
}
_currentGenesis.WriteRegister(reg, value, checkRegister: true);
return;
}
private void ViewProgressPcb(Boolean isActive)
{
if (isActive)
{
Invoke(new Action(() =>
{
lblProgressPcb.Text = StrConnecting;
barProgressPcb.Value = 0;
lblProgressPcb.Visible = true;
barProgressPcb.Visible = true;
tmrProgressPcb.Enabled = true;
lblConnectPcb.Visible = false;
}));
}
else
{
Invoke(new Action(() =>
{
tmrProgressPcb.Enabled = false;
lblProgressPcb.Visible = false;
barProgressPcb.Visible = false;
lblConnectPcb.Visible = true;
}));
}
}
private void ViewProgressDb(Boolean isActive)
{
if (isActive)
{
Invoke(new Action(() =>
{
lblProgressDb.Text = StrConnecting;
barProgressDb.Value = 0;
lblProgressDb.Visible = true;
barProgressDb.Visible = true;
tmrProgressDb.Enabled = true;
lblConnectDb.Visible = false;
}));
}
else
{
Invoke(new Action(() =>
{
tmrProgressDb.Enabled = false;
lblProgressDb.Visible = false;
barProgressDb.Visible = false;
lblConnectDb.Visible = true;
}));
}
}
private void cbComSlot_SelectedIndexChanged_1(Object sender, EventArgs e)
{
Init();
}
private void FrmPassword_FormClosing(Object sender, FormClosingEventArgs e)
{
Dispose();
}
private new void Dispose()
{
_meterBatch?.RemoveAllMeters();
_meterBatch?.Dispose();
base.Dispose();
}
/// <remarks date="2025-Oct-02" author="Thomas Wiedebusch">
/// - Catch error message on unknown data type and kill meter.
/// </remarks>
private void Connect()
{
Int32 slotNr;
lblConnectPcb.Text = StrNotConnected;
lblConnectPcb.ForeColor = Color.Red;
txtPcbID.Text = "";
txtSkeletonKey.Text = "";
btnGet.Enabled = false;
//btnSet.Enabled = false;
if (!string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) &&
int.TryParse(cbComSlot.SelectedItem.ToString(), out slotNr))
{
try
{
_meterBatch.RemoveAllMeters();
_currentGenesis = null;
ViewProgressPcb(true);
_currentGenesis = new GenesisMeter();
_currentGenesis.SetupFromConfigFile(slotNr);
_meterBatch.AddMeter(_currentGenesis);
Task.Factory.StartNew(() =>
{
_meterBatch.MetersLogin();
if (_currentGenesis.IsLoggedOn)
{
_currentGenesis.EnableAutoLogon();
//switch LED off
WriteValue(Register.Genesisflow.LedMode, (Byte)LedMode.Off);
Invoke(new Action(() =>
{
lblConnectPcb.Text = StrPartPcbConnected + $@" {_currentGenesis.PcbId}";
txtPcbID.Text = _currentGenesis.PcbId;
lblConnectPcb.ForeColor = Color.Green;
//btnConnect.Enabled = false;
btnGet_Click(this, null);
}));
}
}).ContinueWith(delegate { ViewProgressPcb(false); });
}
catch (Exception ex)
{
ViewProgressPcb(false);
MessageBox.Show(ex.Message, @"FAILED", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Dispose meter
_meterBatch.RemoveAllMeters();
// If meter is not already assigned to batch as the config reader may fail
_currentGenesis?.DisposeMeter();
}
}
}
private void TmrProgressPcb_Tick(Object sender, EventArgs e)
{
if (barProgressPcb.Value == 100)
{
barProgressPcb.Value = 0;
}
barProgressPcb.Value += 1;
}
private void TmrProgressDb_Tick(Object sender, EventArgs e)
{
if (barProgressDb.Value == 100)
{
barProgressDb.Value = 0;
}
barProgressDb.Value += 1;
}
private void btnConnect_Click(Object sender, EventArgs e)
{
Connect();
}
private void Init()
{
lblConnectPcb.Text = StrNotConnected;
lblConnectPcb.ForeColor = Color.Red;
lblConnectDb.Text = StrNotConnected;
lblConnectDb.ForeColor = Color.Red;
btnConnect.Enabled = true;
txtPcbID.Text = "";
txtSkeletonKey.Text = "";
btnGet.Enabled = false;
btnWritePwdFile.Enabled = false;
}
private void txtPcbID_TextChanged(Object sender, EventArgs e)
{
//setting is only allowed if genesis is not connected
if (txtPcbID.Text.Length > 7 && lblConnectPcb.Text == StrNotConnected)
{
btnGet.Enabled = true;
}
else
{
btnGet.Enabled = false;
}
lblConnectDb.Text = StrNotConnected;
lblConnectDb.ForeColor = Color.Red;
txtSkeletonKey.Text = "";
}
private void txtPassword_TextChanged(Object sender, EventArgs e)
{
//setting is only allowed if genesis is not connected
if (txtPcbID.Text.Length > 7 && txtSkeletonKey.Text.Length == 12
&& lblConnectPcb.Text == StrNotConnected)
{
//btnSet.Enabled = true;
}
else
{
//btnSet.Enabled = false;
}
}
/// <summary>
/// Marker for readiness of password file
/// </summary>
private Boolean _isReadyPasswordFile;
private Byte[] _passwordFile =
{
//Level 1 BSI first 12 signs - SHA1
0x3E, 0x20, 0x5F, 0x63, 0xA9, 0x1C, 0x47, 0xAE, 0x87, 0xDB,
0x70, 0x15, 0x18, 0xD5, 0xF2, 0xE5, 0xF6, 0x12, 0x0C, 0xEC,
//Level 2 BSI first 12 signs - SHA1
0xFF, 0x40, 0xDF, 0x97, 0xF9, 0x68, 0x11, 0xCC, 0x1C, 0x8A,
0xA4, 0xF0, 0x6C, 0x7C, 0xDF, 0xD6, 0xC5, 0x67, 0x1A, 0x89,
//Level 3 Skeleton 10C66CCBDD24 for PCBID182100041 UID - SHA1
0x7B, 0x6C, 0xF3, 0x8F, 0x88, 0x60, 0x0A, 0x33, 0x2D, 0xA1,
0xAF, 0x29, 0x13, 0x35, 0x7C, 0x76, 0x9A, 0xF9, 0x76, 0x7A,
//Level 4 BSI first 12 signs - SHA1
0xE8, 0xF7, 0xCA, 0x99, 0x8B, 0x31, 0xD8, 0xB8, 0xA4, 0xE3,
0xBD, 0x32, 0x3C, 0xA4, 0x97, 0x85, 0xF7, 0xAE, 0x5A, 0xA7,
//Level 5 BSI first 12 signs - SHA1
0xFE, 0xA8, 0xE7, 0xC7, 0x07, 0x6B, 0x16, 0xE9, 0x0E, 0x9A,
0x4B, 0xC4, 0x31, 0x39, 0x1C, 0xE0, 0xEF, 0xA9, 0xF2, 0x29,
//Level 6 BSI first 12 signs - SHA1
0xF7, 0x03, 0x24, 0x84, 0xB6, 0x4C, 0x13, 0xDE, 0x7C, 0xDC,
0x84, 0x0F, 0x63, 0x25, 0x57, 0xE0, 0x8F, 0x7B, 0x07, 0xE7,
//Level 7 BSI first 12 signs - SHA1
0x0E, 0x08, 0x66, 0x7F, 0xE2, 0xF1, 0x1E, 0x42, 0x24, 0x62,
0x9E, 0xCB, 0xCA, 0xA3, 0xE6, 0x24, 0xC9, 0x6F, 0x34, 0xB8,
//Level 8 BSI first 12 signs - SHA1
0x2E, 0x90, 0xCD, 0x0C, 0x6C, 0x4E, 0x83, 0xAA, 0x1B, 0x5B,
0x95, 0xA4, 0xC0, 0xF2, 0x8E, 0x1A, 0xF7, 0x6B, 0x06, 0x03
};
private void btnWritePwdFile_Click(Object sender, EventArgs e)
{
//DataBase content: FE081F0 FE 82 C8 58 05 C3 E4 24 00 04 80 00 70 03 48 99
//FE081F0 22 12 F0 59 04 34 C5 24 00 04 80 00 70 03 48 9A
//var meterPwdFile = new MeterPwdFile(_currentGenesis);
//Byte[] processorUid = { 0x2D, 0x83, 0xC8, 0x58, 0x01, 0x9B, 0xEB, 0x24 };
//Byte[] processorUid = { 0x22, 0x12, 0xF0, 0x59, 0x04, 0x34, 0xC5, 0x24 };
//var skeletonKey = meterPwdFile.BuildSkeletonKey(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
//var level3Pwd = meterPwdFile.BuildLevel3Pwd(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
/// todo implement passwordcontroller call
var url = ServiceUrls.GenesisGetPasswordContainerServiceUrl();
var http = (HttpWebRequest)WebRequest.Create($"{url}{_currentGenesis.PcbId}");
//var http = (HttpWebRequest)WebRequest.Create($"{url}19080010");
http.Headers.Add("Cache-Control", "no-cache");
var a = new MeterPwdDb();
try
{
var response = (HttpWebResponse)http.GetResponse();
var responseStream = response.GetResponseStream();
if (responseStream == null)
{
throw new InvalidOperationException();
}
if (response.StatusCode != HttpStatusCode.OK)
{
}
using (var sr = new StreamReader(responseStream))
{
var responseJson = sr.ReadToEnd();
responseJson = responseJson.Trim('"');
a = JsonConvert.DeserializeObject<MeterPwdDb>(responseJson);
}
}
catch (Exception)
{
throw;
}
var listOfRawPasswords = new List<Byte[]>();
var dbSekeletonKey = "";
UInt64 processorUid = 1;
if (!_isReadyPasswordFile)
{
return;
}
var meterPwdFile = new MeterPwdFile(_currentGenesis);
if (meterPwdFile.BuildPwdFile(a.ListOfPasswords, processorUid, a.Skeleton))
{
if (meterPwdFile.UnlockEraseWriteMeterPwdFile())
{
meterPwdFile.WriteMeterPwdFile();
}
}
else
{
//todo error msg
}
//TEST build level3 password out of UID (Unique Processor ID)
//DataBase content: FE081F0 93 82 C8 58 08 E5 11 24 00 04 80 00 70 03 48 99
//Byte[] processorUid = { 0x93, 0x82, 0xC8, 0x58, 0x08, 0xE5, 0x11, 0x24 };
//DataBase content: FE081F0 FE 82 C8 58 05 C3 E4 24 00 04 80 00 70 03 48 99
////Byte[] processorUid = { 0xFE, 0x82, 0xC8, 0x58, 0x05, 0xC3, 0xE4, 0x24 };
////var skeletonKey = meterPwdFile.BuildSkeletonKey(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
////var level3Pwd = meterPwdFile.BuildLevel3Pwd(RegisterConverter.ByteArrayToValue<UInt64>(processorUid));
}
private void btnErasePwdFile_Click(Object sender, EventArgs e)
{
var meterPwdFile = new MeterPwdFile(_currentGenesis);
if (meterPwdFile.UnlockEraseWriteMeterPwdFile())
{
meterPwdFile.EraseMeterPwdFile();
}
}
private void FrmPassword_Load(Object sender, EventArgs e)
{
}
private String GenSkeletnkey(UInt64 v)
{
var s = MeterPwdFile.BuildSkeletonKey(v);
var r = "";
r += s[10];
r += s[11];
r += s[8];
r += s[9];
r += s[6];
r += s[7];
r += s[4];
r += s[5];
r += s[2];
r += s[3];
r += s[0];
r += s[1];
return r;
}
private void txtLvl8_DoubleClick(Object sender, EventArgs e)
{
var sb = new StringBuilder();
sb.Append(GenSkeletnkey((UInt64)0x0413F059069BEB24)).Append("192000001").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x1013F0590434C524)).Append("192000004").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x1013F05903661024)).Append("192000006").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x1B13F0590434C524)).Append("192000007").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x8613F05903661024)).Append("192000009").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x0413F0590434C524)).Append("192000010").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x0413F0590434C524)).Append("192000010").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x7A13F0590434C524)).Append("192000012").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xF812F0590434C524)).Append("192000014").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xF812F05903661024)).Append("192000015").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xF812F059069BEB24)).Append("192000016").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x0413F05903661024)).Append("192000017").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xEC12F05903661024)).Append("192000018").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xC812F0590434C524)).Append("192000019").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xE012F059069BEB24)).Append("192000021").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xD412F0590434C524)).Append("192000022").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xD412F05903661024)).Append("192000024").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xC812F059069BEB24)).Append("192000027").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xD412F059069BEB24)).Append("192000029").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xB112F059069BEB24)).Append("192000033").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x7512F059069BEB24)).Append("192000040").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x7512F05903661024)).Append("192000042").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x8D12F05903661024)).Append("192000043").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x9812F059069BEB24)).Append("192000045").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x7512F0590434C524)).Append("192000046").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x7512F0590434C524)).Append("192000046").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x8112F0590434C524)).Append("192000048").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x9213F05903661024)).Append("192000049").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x9E13F05903661024)).Append("192000051").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x9E13F05903661024)).Append("192000051").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xD913F059069BEB24)).Append("192200002").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xE513F059069BEB24)).Append("192200003").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xD913F05903661024)).Append("192200005").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xC213F05903661024)).Append("192200006").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xE513F0590434C524)).Append("192200007").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xFD13F059069BEB24)).Append("192200008").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xF113F0590434C524)).Append("192200009").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xF113F05903661024)).Append("192200010").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xF113F059069BEB24)).Append("192200011").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xE513F05903661024)).Append("192200013").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x1414F05903661024)).Append("192200014").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x1414F059069BEB24)).Append("192200015").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x0814F05903661024)).Append("192200016").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x0814F059069BEB24)).Append("192200017").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0xFD13F0590434C524)).Append("192200018").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x1414F0590434C524)).Append("192200019").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x3714F05903661024)).Append("192200020").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x2B14F0590434C524)).Append("192200021").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x2014F0590434C524)).Append("192200022").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x2014F05903661024)).Append("192200023").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x2014F059069BEB24)).Append("192200024").Append(",").AppendLine();
sb.Clear();
sb.Append(GenSkeletnkey((UInt64)0x1011F0590434C524)).Append("19080029").Append(",").AppendLine();
sb.Append(GenSkeletnkey((UInt64)0x5D12F05903661024)).Append("19080002").Append(",").AppendLine();
MessageBox.Show(sb.ToString());
}
private void txtLvl8_TextChanged(Object sender, EventArgs e)
{
}
}
}