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
}
}