dotnet --version
# => 6.0.101
dotnet add package NSec.Cryptography
dotnet run
# => Dataset: {"test":1}
# Valid: True
using System; | |
using System.Text; | |
using NSec.Cryptography; | |
public class Program | |
{ | |
private const string licenseKey = "key/eyJ0ZXN0IjoxfQ==._f34UAAtNKM8TXGLlnblBGCLSy22Oa_gjp4jn0CpvEuwQ2gAcH0IntFKwtbyV5iWnH9_x8l0R144oHp2_GviAw=="; | |
private const string publicKeyHex = "e8601e48b69383ba520245fd07971e983d06d22c4257cfd82304601479cee788"; | |
public static void Main() | |
{ | |
var algorithm = SignatureAlgorithm.Ed25519; | |
// Read signature | |
var licenseStringTokens = licenseKey.Split('.'); | |
var encodedSignature = convertBase64UrlString(licenseStringTokens[1]); | |
var signatureBytes = Convert.FromBase64String(encodedSignature); | |
// Read data | |
var signingData = licenseStringTokens[0].Split('/'); | |
var signingDataBytes = Encoding.UTF8.GetBytes($"key/{signingData[1]}"); | |
// Read public key | |
var publicKeyBytes = Convert.FromHexString(publicKeyHex); | |
var publicKey = PublicKey.Import(algorithm, publicKeyBytes, KeyBlobFormat.RawPublicKey); | |
// Verify | |
var valid = algorithm.Verify(publicKey, signingDataBytes, signatureBytes); | |
if (valid) | |
{ | |
var encodedDataset = convertBase64UrlString(signingData[1]); | |
var decodedDataset = Convert.FromBase64String(encodedDataset); | |
var dataset = Encoding.UTF8.GetString(decodedDataset); | |
Console.WriteLine($"Dataset: {dataset}"); | |
} | |
Console.WriteLine($"Valid: {valid}"); | |
} | |
private static string convertBase64UrlString(string s) | |
{ | |
return s.Replace("-", "+").Replace("_", "/"); | |
} | |
} |
Thank you!. This gist helped me solve a problem that I had been banging my head on for a day :)