LevelcodeLicenseClient/Security/LicenseEngine.cs
2026-03-25 16:34:45 -03:00

73 lines
2.2 KiB
C#

using Levelcode_licenseCliente.Models;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
namespace Levelcode_licenseCliente.Security
{
public static class LicenseEngine
{
// =========================
// VALIDAR ARQUIVO .KEY
// =========================
public static LicensePayload ValidarArquivoKey(
string caminhoArquivo,
string chavePublicaXml)
{
if (!File.Exists(caminhoArquivo))
throw new Exception("Arquivo de licença não encontrado.");
string conteudo = File.ReadAllText(caminhoArquivo);
string[] partes = conteudo.Split(new[] { "|SIGN|" },
StringSplitOptions.None);
if (partes.Length != 2)
throw new Exception("Formato de licença inválido.");
string payloadBase64 = partes[0];
string assinaturaBase64 = partes[1];
byte[] payloadBytes = Convert.FromBase64String(payloadBase64);
byte[] assinaturaBytes = Convert.FromBase64String(assinaturaBase64);
// 🔐 Verificar assinatura
if (!VerificarAssinatura(payloadBytes, assinaturaBytes, chavePublicaXml))
throw new Exception("Assinatura da licença inválida.");
// 📦 Desserializar payload
string json = Encoding.UTF8.GetString(payloadBytes);
LicensePayload payload =
JsonSerializer.Deserialize<LicensePayload>(json);
if (payload == null)
throw new Exception("Payload inválido.");
return payload;
}
// =========================
// VERIFICAR ASSINATURA RSA
// =========================
private static bool VerificarAssinatura(
byte[] dados,
byte[] assinatura,
string chavePublicaXml)
{
using (RSA rsa = RSA.Create())
{
rsa.FromXmlString(chavePublicaXml);
return rsa.VerifyData(
dados,
assinatura,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);
}
}
}
}