Skip to content

Instantly share code, notes, and snippets.

@ezekg
Last active August 19, 2023 10:30
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ezekg/e96ef9c71a8f97b9ffcb487b73bfe248 to your computer and use it in GitHub Desktop.
Save ezekg/e96ef9c71a8f97b9ffcb487b73bfe248 to your computer and use it in GitHub Desktop.
How to verify a signed license key using C#, Ed25519 and the NSEC crypto package. See: https://keygen.sh

Setup dependencies

dotnet --version
# => 6.0.101

dotnet add package NSec.Cryptography

Run the example

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("_", "/");
}
}
@aneesdhansey
Copy link

Thank you!. This gist helped me solve a problem that I had been banging my head on for a day :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment