using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace EgwCoreLib.Utils { /// /// Classe validazione valori /// public class MachineDataValidator { #region Public Fields public static Dictionary biosInfo = new Dictionary(); public static Dictionary cpuInfo = new Dictionary(); public static Dictionary netInfo = new Dictionary(); public static Dictionary osInfo = new Dictionary(); public static Dictionary ramInfo = new Dictionary(); public static Dictionary userInfo = new Dictionary(); public static Dictionary volInfo = new Dictionary(); #endregion Public Fields #region Public Constructors /// /// Init classe validatore /// /// public MachineDataValidator() { // inizializzo info di base if (machTestData == null || machTestData.Count == 0) { machTestData = setupData(); } } /// /// Init classe validatore /// /// public MachineDataValidator(string rawData) { // inizializzo info di base Dictionary currMachineData = new Dictionary(); if (!string.IsNullOrEmpty(rawData)) { try { currMachineData = JsonConvert.DeserializeObject>(rawData); } catch (Exception exc) { } } } #endregion Public Constructors #region Public Properties public bool hasValidData { get => machTestData != null && machTestData.Count > 0; } /// /// Restituisce HASH del codice impiego = payload utente /// /// public string macHash { get => calcMachineHash(); } #endregion Public Properties #if false /// /// Verifica validità info correnti /// /// public async Task testCurrInfo() { return await testInfo(); } #endif #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 static 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(); try { // 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["OSArchitecture"]}|"); sb.Append($"{machTestData["SoftwareElementID"]}|"); sb.Append($"{machTestData["SystemBiosMajorVersion"]}|"); sb.Append($"{machTestData["SystemBiosMinorVersion"]}|"); sb.Append($"{machTestData["CpuVersion"]}|"); sb.Append($"{machTestData["BiosVersion"]}|"); if (sb.Length > 0) { answ = sb.ToString(); // lo uso 2 volte dritto e reverse... answ += ReverseString(sb.ToString()); } } catch { } return answ; } /// /// 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; } /// /// Esegue reverse delal stringa /// /// /// private string ReverseString(string myStr) { char[] myArr = myStr.ToCharArray(); Array.Reverse(myArr); return new string(myArr); } /// /// Predispone elenco dati di test /// /// private Dictionary setupData() { // creo un unico array di info Dictionary testData = new Dictionary(); biosInfo = MachineInfo.GetInfo("BIOS"); cpuInfo = MachineInfo.GetInfo("CPU"); netInfo = MachineInfo.GetInfo("NET"); osInfo = MachineInfo.GetInfo("OS"); ramInfo = MachineInfo.GetInfo("RAM"); userInfo = MachineInfo.GetInfo("USER"); volInfo = MachineInfo.GetInfo("VOL"); 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 } }