using System.Security.Cryptography; using System.Text; namespace MP.MONO.Core { /// /// Classe validazione valori /// public class MachineDataValidator { #region Public Constructors /// /// Init classe validatore /// /// public MachineDataValidator() { // inizializzo info di base machTestData = setupData().Result; } #endregion Public Constructors #region Public Properties /// /// Restituisce HASH del codice impiego = payload utente /// /// public string macHash { get => calcMachineHash(); } #endregion Public Properties #region Public Methods /// /// Verifica validità info correnti /// /// public static async Task testCurrInfo() { var cDV = new MachineDataValidator(); return await cDV.testInfo(); } #endregion Public Methods #region Private Fields /// /// Dati rispetto cui fare i calcoli di validazione /// private Dictionary machTestData = new Dictionary(); #endregion Private Fields #region Private Methods /// /// Calcola HASH del codice impiego = payload utente /// /// private string calcMachineHash() { string hash = ""; string buffData = currBaseBuffer(); if (!string.IsNullOrEmpty(buffData)) { // hashing! using (var hAlgo = SHA512.Create()) //using (var hAlgo = MD5.Create()) { byte[] InputBytes = Encoding.UTF8.GetBytes(buffData); var byteHash = hAlgo.ComputeHash(InputBytes); hash = BitConverter.ToString(byteHash).Replace("-", "").Replace("/", "").Replace("\\", "").ToLowerInvariant(); } } return hash; } /// /// Calcola hash key da info PC /// /// private string currBaseBuffer() { string answ = "????????????????????????????????????????????"; StringBuilder sb = new StringBuilder(); // calcolo hashKey da alcuni valori solamente sb.Append($"{machTestData["SystemName"]}|"); sb.Append($"{machTestData["ProcessorId"]}|"); sb.Append($"{machTestData["PartNumber"]}|"); sb.Append($"{machTestData["MACAddress"]}|"); sb.Append($"{machTestData["SerialNumber"]}|"); sb.Append($"{machTestData["Architecture"]}|"); sb.Append($"{machTestData["SoftwareElementID"]}|"); sb.Append($"{machTestData["SystemBiosMajorVersion"]}|"); sb.Append($"{machTestData["SystemBiosMinorVersion"]}|"); if (sb.Length > 0) { answ = sb.ToString(); // lo uso 2 volte dritto e reverse... answ += ReverseString(sb.ToString()); } return answ; } /// /// Esegue reverse delal stringa /// /// /// private string ReverseString(string myStr) { char[] myArr = myStr.ToCharArray(); Array.Reverse(myArr); return new string(myArr); } /// /// Legge la hash key dal file licenza salvato /// /// /// private async Task getSavedHash() { string answ = "############################################################"; string filePath = "Conf/lic.file"; if (File.Exists(filePath)) { answ = await File.ReadAllTextAsync(filePath); } return answ; } /// /// Predispone elenco dati di test /// /// private async Task> setupData() { // creo un unico array di info Dictionary testData = new Dictionary(); var biosInfo = await MachineInfo.GetInfo("BIOS"); var cpuInfo = await MachineInfo.GetInfo("CPU"); var netInfo = await MachineInfo.GetInfo("NET"); var osInfo = await MachineInfo.GetInfo("OS"); var ramInfo = await MachineInfo.GetInfo("RAM"); testData = biosInfo.Concat(cpuInfo).Concat(netInfo).Concat(osInfo).Concat(ramInfo).GroupBy(ele => ele.Key).ToDictionary(ele => ele.Key, ele => ele.First().Value); return testData; } /// /// Effettua verifica putuale tra hash Key fornita ed hash key calcolata da info PC /// /// private async Task testInfo() { // recupero hash key da conf applicativo (licenza) string fileHash = await getSavedHash(); /// recupero hash calcolata string calcHash = calcMachineHash(); // confronto con hashKey calcolata da info PC + dati... return fileHash.Equals(calcHash); } #endregion Private Methods } }