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
if (machTestData == null || machTestData.Count == 0)
{
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
#if false
///
/// Verifica validità info correnti
///
///
public async Task testCurrInfo()
{
return await testInfo();
}
#endif
///
/// 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;
}
///
/// 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;
}
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();
///
/// Predispone elenco dati di test
///
///
private async Task> setupData()
{
// creo un unico array di info
Dictionary testData = new Dictionary();
biosInfo = await MachineInfo.GetInfo("BIOS");
cpuInfo = await MachineInfo.GetInfo("CPU");
netInfo = await MachineInfo.GetInfo("NET");
osInfo = await MachineInfo.GetInfo("OS");
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
}
}